Android SmsManager(短信管理器)

2023-03-31 14:22 更新

本節(jié)引言:

本節(jié)帶來(lái)的是Android中的SmsManager(短息管理器),見(jiàn)名知意,就是用來(lái)管理手機(jī)短信的, 而該類(lèi)的應(yīng)用場(chǎng)景并不多,一般是我們發(fā)短信的時(shí)候才會(huì)用到這個(gè)API,當(dāng)然這種短信是 文字短信,對(duì)于彩信過(guò)于復(fù)雜,而且在QQ微信各種社交APP橫行的年代,你會(huì)去發(fā)1塊錢(qián)一條的 彩信嗎?所以本節(jié)我們只討論發(fā)送普通文字短信! 官方文檔:SmsManager


1.調(diào)用系統(tǒng)發(fā)送短信功能:

就是把寫(xiě)好的收信人和內(nèi)容發(fā)送到系統(tǒng)的發(fā)送短信的界面,用戶(hù)驗(yàn)證收件人內(nèi)容是否真正確再點(diǎn)擊發(fā)送! 說(shuō)白了就是調(diào)用系統(tǒng)發(fā)短信的窗口,這樣做有一定的好處:

這樣發(fā)短信,app安裝的時(shí)候就可以少寫(xiě)一條發(fā)短信的權(quán)限,那么諸如360這類(lèi)安全軟件在安裝的時(shí)候 就不會(huì)提醒用戶(hù):"這個(gè)APP有短信權(quán)限,可能會(huì)偷偷滴發(fā)短信喔",而用戶(hù)對(duì)于偷偷發(fā)短信的行為是十分 厭惡的,當(dāng)然有些人不看直接安裝,而有些人可能會(huì)覺(jué)得會(huì)偷偷發(fā)短信喔,好惡心的應(yīng)用,我才不裝咧, 又或者直接禁止我們的APP發(fā)送短信,那么當(dāng)我們APP在發(fā)送短信的時(shí)候就可能會(huì)出現(xiàn)一些異常,或者 應(yīng)用直接崩潰等!所以如果你的應(yīng)用需要發(fā)送短信進(jìn)行驗(yàn)證或者付費(fèi)這些東西的話(huà),建議使用這種方式!

核心代碼

public void SendSMSTo(String phoneNumber,String message){    
    //判斷輸入的phoneNumber是否為合法電話(huà)號(hào)碼  
    if(PhoneNumberUtils.isGlobalPhoneNumber(phoneNumber)){  
        //Uri.parse("smsto") 這里是轉(zhuǎn)換為指定Uri,固定寫(xiě)法  
        Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+phoneNumber));        
        intent.putExtra("sms_body", message);              
        startActivity(intent);    
    }    
}    

2.調(diào)用系統(tǒng)提供的短信接口發(fā)送短信

這個(gè)就需要發(fā)短信的權(quán)限啦

uses-permission android:name="android.permission.SEND_SMS"/>

我們直接調(diào)用SmsManager為我們提供的短信接口發(fā)送短信:

sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliverIntent);

參數(shù)依次是:

  • destinationAddress:收信人的電話(huà)號(hào)碼
  • scAddress:短信中心的號(hào)碼,null的話(huà)使用當(dāng)前默認(rèn)的短信服務(wù)中心
  • text:短信內(nèi)容
  • sentIntent:短信發(fā)送狀態(tài)的信息:(發(fā)送狀態(tài)的Intent) 如果不為null,當(dāng)消息成功發(fā)送或失敗這個(gè)PendingIntent就廣播。結(jié)果代碼是Activity.RESULT_OK 表示成功,或RESULT_ERROR_GENERIC_FAILURE、RESULT_ERROR_RADIO_OFF、RESULT_ERROR_NULL_PDU 之一表示錯(cuò)誤。對(duì)應(yīng)RESULT_ERROR_GENERIC_FAILURE,sentIntent可能包括額外的"錯(cuò)誤代碼"包含一 個(gè)無(wú)線(xiàn)電廣播技術(shù)特定的值,通常只在修復(fù)故障時(shí)有用。每一個(gè)基于SMS的應(yīng)用程序控制檢測(cè)sentIntent。 如果sentIntent是空,調(diào)用者將檢測(cè)所有未知的應(yīng)用程序,這將導(dǎo)致在檢測(cè)的時(shí)候發(fā)送較小數(shù)量的SMS。
  • deliverIntent:短信是否被對(duì)方收到的狀態(tài)信息:(接收狀態(tài)的Intent) 如果不為null,當(dāng)這個(gè)短信發(fā)送到接收者那里,這個(gè)PendtingIntent會(huì)被廣播, 狀態(tài)報(bào)告生成的pdu(指對(duì)等層次之間傳遞的數(shù)據(jù)單位)會(huì)拓展到數(shù)據(jù)("pdu")
  • ...那么復(fù)雜,pdu是什么卵?好吧,別糾結(jié),簡(jiǎn)單知道這些參數(shù)是:

    電話(huà)號(hào)碼,信息中心,短信內(nèi)容,是否發(fā)送成功的監(jiān)聽(tīng),以及收信人是否接受的監(jiān)聽(tīng)就好了!

    核心代碼:

    public void sendSMS(String phoneNumber,String message){  
        //獲取短信管理器   
        android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault();  
        //拆分短信內(nèi)容(手機(jī)短信長(zhǎng)度限制),貌似長(zhǎng)度限制為140個(gè)字符,就是
        //只能發(fā)送70個(gè)漢字,多了要拆分成多條短信發(fā)送
        //第四五個(gè)參數(shù),如果沒(méi)有需要監(jiān)聽(tīng)發(fā)送狀態(tài)與接收狀態(tài)的話(huà)可以寫(xiě)null    
        List<String> divideContents = smsManager.divideMessage(message);   
        for (String text : divideContents) {    
            smsManager.sendTextMessage(phoneNumber, null, text, sentPI, deliverPI);    
        }  
    } 

    可能你還需要監(jiān)聽(tīng)短信是否發(fā)送成功,或者收信人是否接收到信息,就把下面的加上吧:

    1)處理返回發(fā)送狀態(tài)的sentIntent

    //處理返回的發(fā)送狀態(tài)   
    String SENT_SMS_ACTION = "SENT_SMS_ACTION";  
    Intent sentIntent = new Intent(SENT_SMS_ACTION);  
    PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, sentIntent,  0);  
    //注冊(cè)發(fā)送信息的廣播接收者
    context.registerReceiver(new BroadcastReceiver() {  
        @Override  
        public void onReceive(Context _context, Intent _intent) {  
            switch (getResultCode()) {  
            case Activity.RESULT_OK:
                Toast.makeText(context, "短信發(fā)送成功", Toast.LENGTH_SHORT).show();  
                break;  
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:    //普通錯(cuò)誤
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:         //無(wú)線(xiàn)廣播被明確地關(guān)閉
                break;          
            case SmsManager.RESULT_ERROR_NULL_PDU:          //沒(méi)有提供pdu
                break;      
            case SmsManager.RESULT_ERROR_NO_SERVICE:         //服務(wù)當(dāng)前不可用
                break;              
            }  
        }  
    }, new IntentFilter(SENT_SMS_ACTION)); 

    2)處理返回接收狀態(tài)的deliverIntent:

    //處理返回的接收狀態(tài)   
    String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";  
    //創(chuàng)建接收返回的接收狀態(tài)的Intent  
    Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);  
    PendingIntent deliverPI = PendingIntent.getBroadcast(context, 0,deliverIntent, 0);  
    context.registerReceiver(new BroadcastReceiver() {  
       @Override  
       public void onReceive(Context _context, Intent _intent) {  
           Toast.makeText(context,"收信人已經(jīng)成功接收", Toast.LENGTH_SHORT).show();  
       }  
    }, new IntentFilter(DELIVERED_SMS_ACTION)); 
  • 本節(jié)小結(jié):

    好的,本節(jié)介紹了SmsManager發(fā)送文字短信的兩種方式~非常簡(jiǎn)單~建議還是使用 第一種方案吧,起碼用戶(hù)體驗(yàn)好一點(diǎn)...


    以上內(nèi)容是否對(duì)您有幫助:
    在線(xiàn)筆記
    App下載
    App下載

    掃描二維碼

    下載編程獅App

    公眾號(hào)
    微信公眾號(hào)

    編程獅公眾號(hào)