接收和發(fā)送短信

當(dāng)手機(jī)接收到一條短信的時(shí)候徐伐,系統(tǒng)就會(huì)發(fā)出一條值為android.provider.Telephony.SMS_RECEIVED的廣播,這條廣播里攜帶著與短信相關(guān)的所有數(shù)據(jù)扫夜,系統(tǒng)發(fā)出的短信廣播是一條有序廣播

接收短信


  • 在活動(dòng)創(chuàng)建的時(shí)候俘闯,組件初始化操作并注冊(cè)接收短信的監(jiān)聽器:
@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();         
    //動(dòng)態(tài)注冊(cè)監(jiān)聽器
    registerReceiver(messageReceiver, receiveFilter);                                                   
}                                                                      
  • 動(dòng)態(tài)注冊(cè)廣播接收器,需要在活動(dòng)銷毀時(shí)慌随,取消注冊(cè)
@Override                                  
protected void onDestroy() {               
    super.onDestroy();       
    //取消注冊(cè)廣播接收器              
    unregisterReceiver(messageReceiver);   
}                                          
  • 實(shí)現(xiàn)接收短信的廣播接收器
 class MessageReceiver extends BroadcastReceiver {                                                                                 
    @Override                                                        
    public void onReceive(Context context, Intent intent) {   
        // 從Intent參數(shù)中取出一個(gè)Bundle對(duì)象
        Bundle bundle = intent.getExtras();
       //使用pdu密鑰來提取一個(gè)SMS  pdus數(shù)組,其中每一個(gè)pdu都表示一條短信消息                          
        Object[] pdus = (Object[]) bundle.get("pdus");               
        SmsMessage[] messages = new SmsMessage[pdus.length];         
        for (int i = 0; i < messages.length; i++) {      
           //使用SmsMessage()的靜態(tài)方法createFromPdu()方法將每一個(gè)pdu字節(jié)數(shù)組轉(zhuǎn)換為SmsMessage對(duì)象
            messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
        }              
        //調(diào)用SmsMessage對(duì)象的getOriginatingAddress()方法就可以獲取到短信的發(fā)送發(fā)號(hào)碼                                              
        String address = messages[0].getOriginatingAddress();        
        String fullMessage = "";                                     
        for (SmsMessage message : messages) {
            //調(diào)用SmsMessage對(duì)象的getMessageBody()方法就可以獲取到短信的內(nèi)容躺同,將每一個(gè)SmsMessage對(duì)象中的短信內(nèi)容拼接起來阁猜,就組成了一條完整的短信內(nèi)容                        
            fullMessage += message.getMessageBody();                 
        }
        //給界面上的組件設(shè)置內(nèi)容,將信息發(fā)送方的電話號(hào)碼和信息內(nèi)容顯示在界面上                                                            
        sender.setText(address);                                     
        content.setText(fullMessage);                                                                        
    }                                                                                                                        
}                                                                    
  • 接收短信要聲明權(quán)限
    <uses-permission android:name="android.permission.RECEIVE_SMS" />

攔截短信


系統(tǒng)發(fā)出的短信廣播是一條有序廣播

  • 提高我們自定義信息接收器的優(yōu)先級(jí)蹋艺,讓它能夠先于系統(tǒng)短信程序接收到短信廣播
receiveFilter = new IntentFilter();                                
receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
//設(shè)置優(yōu)先級(jí)
receiveFilter.setPriority(100);                                    
messageReceiver = new MessageReceiver();                           
registerReceiver(messageReceiver, receiveFilter);                  
  • 自定義的信息接收器接收到廣播程序剃袍,處理完邏輯以后,需要終止廣播的繼續(xù)傳遞
sender.setText(address);     
content.setText(fullMessage);
//終止此廣播的繼續(xù)傳遞
abortBroadcast();            

攔截短信的功能謹(jǐn)慎使用捎谨,防止丟失重要的數(shù)據(jù)

發(fā)送短信


  • 發(fā)送普通文本內(nèi)容內(nèi)的短信民效,使用的是SmsMessage類的sendTextMessage()方法
//首先調(diào)用SmsMessage類的getDefault()方法獲取到SmsMessage的實(shí)例對(duì)象                           
SmsManager smsManager = SmsManager.getDefault();               
/*
 * destinationAddress:手機(jī)號(hào)碼
 * scAddress:服務(wù)中心號(hào)碼
 * text:短信內(nèi)容
 * sentIntent:PendingIntent,信息發(fā)送成功或失敗時(shí)觸發(fā)
 * deliveryIntent:PendingIntent涛救,信息抵達(dá)收件人觸發(fā)
 */
smsManager.sendTextMessage((String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent);                                                              
  • 當(dāng)發(fā)送過長文本內(nèi)容的短信時(shí)研铆,首先將信息內(nèi)容切割(不超過一條短信的長度要求),而后發(fā)送
//切割短信內(nèi)容
ArrayList<String> texts = smsManager.divideMessage(String text);
//發(fā)送短信內(nèi)容(參數(shù)代表的意義相同)
smsManager.sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents)

短信發(fā)送成功的提示


發(fā)送短信時(shí)州叠,第四個(gè)參數(shù)sentIntent,是一個(gè)PendingIntent類型凶赁,此參數(shù)在短信發(fā)送成功或失敗時(shí)觸發(fā)

當(dāng)信息發(fā)送成功或失敗時(shí)咧栗,我們發(fā)出一個(gè)廣播,通過監(jiān)聽這個(gè)廣播來實(shí)現(xiàn)通知用戶信息是否發(fā)送成功

  • 接收廣播的邏輯實(shí)現(xiàn)
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();                                            
        }                                                               
    }                                                                   
                                                                        
}                                                                       
  • 注冊(cè)廣播接收器以及給按鈕添加發(fā)送短信的功能邏輯
//注冊(cè)廣播接收器虱肄,指定監(jiān)聽的廣播內(nèi)容
IntentFilter sendFilter = new IntentFilter();                                 
sendFilter.addAction("SENT_SMS_ACTION");                         
sendStatusReceiver = new SendStatusReceiver();                   
registerReceiver(sendStatusReceiver, sendFilter);                

//發(fā)送短信致板,并當(dāng)短信發(fā)送成功或失敗時(shí),觸發(fā)發(fā)出指定內(nèi)容的廣播                                                                 
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);        
    }                                                            
});                                                              
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咏窿,一起剝皮案震驚了整個(gè)濱河市斟或,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌集嵌,老刑警劉巖萝挤,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件御毅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡怜珍,警方通過查閱死者的電腦和手機(jī)端蛆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酥泛,“玉大人今豆,你說我怎么就攤上這事∪嵩” “怎么了呆躲?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捶索。 經(jīng)常有香客問我插掂,道長,這世上最難降的妖魔是什么情组? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任燥筷,我火速辦了婚禮,結(jié)果婚禮上院崇,老公的妹妹穿的比我還像新娘肆氓。我一直安慰自己,他們只是感情好底瓣,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布谢揪。 她就那樣靜靜地躺著,像睡著了一般捐凭。 火紅的嫁衣襯著肌膚如雪拨扶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天茁肠,我揣著相機(jī)與錄音患民,去河邊找鬼。 笑死垦梆,一個(gè)胖子當(dāng)著我的面吹牛匹颤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播托猩,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼印蓖,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了京腥?” 一聲冷哼從身側(cè)響起赦肃,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后他宛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體船侧,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年堕汞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勺爱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讯检,死狀恐怖琐鲁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情人灼,我是刑警寧澤围段,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站投放,受9級(jí)特大地震影響奈泪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜灸芳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一涝桅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧烙样,春花似錦冯遂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至批狱,卻和暖如春裸准,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赔硫。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工炒俱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爪膊。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓向胡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惊完。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理处硬,服務(wù)發(fā)現(xiàn)小槐,斷路器,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 現(xiàn)實(shí)中的廣播:電臺(tái)為了傳達(dá)一些消息而發(fā)送廣播,通過廣播攜帶要傳達(dá)的消息凿跳,群眾只要買一個(gè)收音機(jī)件豌,就可以收到廣播了。 ...
    stevewang閱讀 4,232評(píng)論 0 8
  • 1.引言 在《第四章 Android 四大應(yīng)用組件》中控嗜,簡(jiǎn)單介紹了下四大組件的成員茧彤,屬性,生命周期等疆栏。這里主要是介...
    憶念成風(fēng)閱讀 1,461評(píng)論 1 10
  • 兒子壁顶,讀到你寫給媽媽的作文珠洗,媽媽感到又感動(dòng)又欣慰。從你的作文里若专,媽媽看到了一個(gè)知道感恩又懂事的小小男子漢许蓖。 作文中...
    星星草的夢(mèng)閱讀 450評(píng)論 0 1
  • 1.出自,孩子你慢慢來调衰,愿你有好運(yùn)氣膊爪,如果沒有,希望你學(xué)會(huì)慈悲嚎莉。愿你被很多人愛米酬,如果沒有,希望你學(xué)會(huì)寬容萝喘。 “2....
    蓮花舒梓慧閱讀 245評(píng)論 0 0