W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
本節(jié)帶來的是Android中的SmsManager(短息管理器),見名知意,就是用來管理手機短信的, 而該類的應(yīng)用場景并不多,一般是我們發(fā)短信的時候才會用到這個API,當(dāng)然這種短信是 文字短信,對于彩信過于復(fù)雜,而且在QQ微信各種社交APP橫行的年代,你會去發(fā)1塊錢一條的 彩信嗎?所以本節(jié)我們只討論發(fā)送普通文字短信! 官方文檔:SmsManager
就是把寫好的收信人和內(nèi)容發(fā)送到系統(tǒng)的發(fā)送短信的界面,用戶驗證收件人內(nèi)容是否真正確再點擊發(fā)送! 說白了就是調(diào)用系統(tǒng)發(fā)短信的窗口,這樣做有一定的好處:
這樣發(fā)短信,app安裝的時候就可以少寫一條發(fā)短信的權(quán)限,那么諸如360這類安全軟件在安裝的時候 就不會提醒用戶:"這個APP有短信權(quán)限,可能會偷偷滴發(fā)短信喔",而用戶對于偷偷發(fā)短信的行為是十分 厭惡的,當(dāng)然有些人不看直接安裝,而有些人可能會覺得會偷偷發(fā)短信喔,好惡心的應(yīng)用,我才不裝咧, 又或者直接禁止我們的APP發(fā)送短信,那么當(dāng)我們APP在發(fā)送短信的時候就可能會出現(xiàn)一些異常,或者 應(yīng)用直接崩潰等!所以如果你的應(yīng)用需要發(fā)送短信進行驗證或者付費這些東西的話,建議使用這種方式!
核心代碼:
public void SendSMSTo(String phoneNumber,String message){
//判斷輸入的phoneNumber是否為合法電話號碼
if(PhoneNumberUtils.isGlobalPhoneNumber(phoneNumber)){
//Uri.parse("smsto") 這里是轉(zhuǎn)換為指定Uri,固定寫法
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+phoneNumber));
intent.putExtra("sms_body", message);
startActivity(intent);
}
}
這個就需要發(fā)短信的權(quán)限啦
uses-permission android:name="android.permission.SEND_SMS"/>
我們直接調(diào)用SmsManager為我們提供的短信接口發(fā)送短信:
sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliverIntent);
參數(shù)依次是:
- destinationAddress:收信人的電話號碼
- scAddress:短信中心的號碼,null的話使用當(dāng)前默認(rèn)的短信服務(wù)中心
- text:短信內(nèi)容
- sentIntent:短信發(fā)送狀態(tài)的信息:(發(fā)送狀態(tài)的Intent) 如果不為null,當(dāng)消息成功發(fā)送或失敗這個PendingIntent就廣播。結(jié)果代碼是Activity.RESULT_OK 表示成功,或RESULT_ERROR_GENERIC_FAILURE、RESULT_ERROR_RADIO_OFF、RESULT_ERROR_NULL_PDU 之一表示錯誤。對應(yīng)RESULT_ERROR_GENERIC_FAILURE,sentIntent可能包括額外的"錯誤代碼"包含一 個無線電廣播技術(shù)特定的值,通常只在修復(fù)故障時有用。每一個基于SMS的應(yīng)用程序控制檢測sentIntent。 如果sentIntent是空,調(diào)用者將檢測所有未知的應(yīng)用程序,這將導(dǎo)致在檢測的時候發(fā)送較小數(shù)量的SMS。
- deliverIntent:短信是否被對方收到的狀態(tài)信息:(接收狀態(tài)的Intent) 如果不為null,當(dāng)這個短信發(fā)送到接收者那里,這個PendtingIntent會被廣播, 狀態(tài)報告生成的pdu(指對等層次之間傳遞的數(shù)據(jù)單位)會拓展到數(shù)據(jù)("pdu")
...那么復(fù)雜,pdu是什么卵?好吧,別糾結(jié),簡單知道這些參數(shù)是:
電話號碼,信息中心,短信內(nèi)容,是否發(fā)送成功的監(jiān)聽,以及收信人是否接受的監(jiān)聽就好了!
核心代碼:
public void sendSMS(String phoneNumber,String message){ //獲取短信管理器 android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault(); //拆分短信內(nèi)容(手機短信長度限制),貌似長度限制為140個字符,就是 //只能發(fā)送70個漢字,多了要拆分成多條短信發(fā)送 //第四五個參數(shù),如果沒有需要監(jiān)聽發(fā)送狀態(tài)與接收狀態(tài)的話可以寫null List<String> divideContents = smsManager.divideMessage(message); for (String text : divideContents) { smsManager.sendTextMessage(phoneNumber, null, text, sentPI, deliverPI); } }
可能你還需要監(jiān)聽短信是否發(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); //注冊發(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: //普通錯誤 break; case SmsManager.RESULT_ERROR_RADIO_OFF: //無線廣播被明確地關(guān)閉 break; case SmsManager.RESULT_ERROR_NULL_PDU: //沒有提供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é)介紹了SmsManager發(fā)送文字短信的兩種方式~非常簡單~建議還是使用 第一種方案吧,起碼用戶體驗好一點...
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: