接收和发送短信

当手机接收到一条短信的时候,系统就会发出一条值为android.provider.Telephony.SMS_RECEIVED的广播,这条广播里携带着与短信相关的所有数据,系统发出的短信广播是一条有序广播

接收短信


  • 在活动创建的时候,组件初始化操作并注册接收短信的监听器:
@Override                                                              
protected void onCreate(Bundle savedInstanceState) {                   
    super.onCreate(savedInstanceState);                                
    setContentView(R.layout.activity_main); 
    ....                                                                                               
    eceiveFilter = new IntentFilter();                                
    receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");                          
    messageReceiver = new MessageReceiver();         
    //动态注册监听器
    registerReceiver(messageReceiver, receiveFilter);                                                   
}                                                                      
  • 动态注册广播接收器,需要在活动销毁时,取消注册
@Override                                  
protected void onDestroy() {               
    super.onDestroy();       
    //取消注册广播接收器              
    unregisterReceiver(messageReceiver);   
}                                          
  • 实现接收短信的广播接收器
 class MessageReceiver extends BroadcastReceiver {                                                                                 
    @Override                                                        
    public void onReceive(Context context, Intent intent) {   
        // 从Intent参数中取出一个Bundle对象
        Bundle bundle = intent.getExtras();
       //使用pdu密钥来提取一个SMS  pdus数组,其中每一个pdu都表示一条短信消息                          
        Object[] pdus = (Object[]) bundle.get("pdus");               
        SmsMessage[] messages = new SmsMessage[pdus.length];         
        for (int i = 0; i < messages.length; i++) {      
           //使用SmsMessage()的静态方法createFromPdu()方法将每一个pdu字节数组转换为SmsMessage对象
            messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
        }              
        //调用SmsMessage对象的getOriginatingAddress()方法就可以获取到短信的发送发号码                                              
        String address = messages[0].getOriginatingAddress();        
        String fullMessage = "";                                     
        for (SmsMessage message : messages) {
            //调用SmsMessage对象的getMessageBody()方法就可以获取到短信的内容,将每一个SmsMessage对象中的短信内容拼接起来,就组成了一条完整的短信内容                        
            fullMessage += message.getMessageBody();                 
        }
        //给界面上的组件设置内容,将信息发送方的电话号码和信息内容显示在界面上                                                            
        sender.setText(address);                                     
        content.setText(fullMessage);                                                                        
    }                                                                                                                        
}                                                                    
  • 接收短信要声明权限
    <uses-permission android:name="android.permission.RECEIVE_SMS" />

拦截短信


系统发出的短信广播是一条有序广播

  • 提高我们自定义信息接收器的优先级,让它能够先于系统短信程序接收到短信广播
receiveFilter = new IntentFilter();                                
receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
//设置优先级
receiveFilter.setPriority(100);                                    
messageReceiver = new MessageReceiver();                           
registerReceiver(messageReceiver, receiveFilter);                  
  • 自定义的信息接收器接收到广播程序,处理完逻辑以后,需要终止广播的继续传递
sender.setText(address);     
content.setText(fullMessage);
//终止此广播的继续传递
abortBroadcast();            

拦截短信的功能谨慎使用,防止丢失重要的数据

发送短信


  • 发送普通文本内容内的短信,使用的是SmsMessage类的sendTextMessage()方法
//首先调用SmsMessage类的getDefault()方法获取到SmsMessage的实例对象                           
SmsManager smsManager = SmsManager.getDefault();               
/*
 * destinationAddress:手机号码
 * scAddress:服务中心号码
 * text:短信内容
 * sentIntent:PendingIntent,信息发送成功或失败时触发
 * deliveryIntent:PendingIntent,信息抵达收件人触发
 */
smsManager.sendTextMessage((String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent);                                                              
  • 当发送过长文本内容的短信时,首先将信息内容切割(不超过一条短信的长度要求),而后发送
//切割短信内容
ArrayList<String> texts = smsManager.divideMessage(String text);
//发送短信内容(参数代表的意义相同)
smsManager.sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents)

短信发送成功的提示


发送短信时,第四个参数sentIntent,是一个PendingIntent类型,此参数在短信发送成功或失败时触发

当信息发送成功或失败时,我们发出一个广播,通过监听这个广播来实现通知用户信息是否发送成功

  • 接收广播的逻辑实现
class SendStatusReceiver extends BroadcastReceiver {                    
                                                                        
    @Override                                                           
    public void onReceive(Context context, Intent intent) {             
        if (getResultCode() == RESULT_OK) {                             
            Toast.makeText(context, "Send succeeded", Toast.LENGTH_LONG)
                    .show();                                            
        } else {                                                        
            Toast.makeText(context, "Send failed", Toast.LENGTH_LONG)   
                    .show();                                            
        }                                                               
    }                                                                   
                                                                        
}                                                                       
  • 注册广播接收器以及给按钮添加发送短信的功能逻辑
//注册广播接收器,指定监听的广播内容
IntentFilter sendFilter = new IntentFilter();                                 
sendFilter.addAction("SENT_SMS_ACTION");                         
sendStatusReceiver = new SendStatusReceiver();                   
registerReceiver(sendStatusReceiver, sendFilter);                

//发送短信,并当短信发送成功或失败时,触发发出指定内容的广播                                                                 
send.setOnClickListener(new OnClickListener() {                  
    @Override                                                    
    public void onClick(View v) {                                
        SmsManager smsManager = SmsManager.getDefault();         
        Intent sentIntent = new Intent("SENT_SMS_ACTION");       
        PendingIntent pi = PendingIntent.getBroadcast(           
                MainActivity.this, 0, sentIntent, 0);            
        smsManager.sendTextMessage(to.getText().toString(), null,
                msgInput.getText().toString(), pi, null);        
    }                                                            
});                                                              
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 现实中的广播:电台为了传达一些消息而发送广播,通过广播携带要传达的消息,群众只要买一个收音机,就可以收到广播了。 ...
    stevewang阅读 4,227评论 0 8
  • 1.引言 在《第四章 Android 四大应用组件》中,简单介绍了下四大组件的成员,属性,生命周期等。这里主要是介...
    忆念成风阅读 1,457评论 1 10
  • 儿子,读到你写给妈妈的作文,妈妈感到又感动又欣慰。从你的作文里,妈妈看到了一个知道感恩又懂事的小小男子汉。 作文中...
    星星草的梦阅读 447评论 0 1
  • 1.出自,孩子你慢慢来,愿你有好运气,如果没有,希望你学会慈悲。愿你被很多人爱,如果没有,希望你学会宽容。 “2....
    莲花舒梓慧阅读 242评论 0 0