當前位置:
首頁 > 知識 > SmsManager(簡訊管理器)

SmsManager(簡訊管理器)

1.調用系統發送簡訊功能:


就是把寫好的收信人和內容發送到系統的發送簡訊的界面,用戶驗證收件人內容是否真正確再點擊發送! 說白了就是調用系統發簡訊的窗口,這樣做有一定的好處:

這樣發簡訊,app安裝的時候就可以少寫一條發簡訊的許可權,那麼諸如360這類安全軟體在安裝的時候 就不會提醒用戶:"這個APP有簡訊許可權,可能會偷偷滴發簡訊喔",而用戶對於偷偷發簡訊的行為是十分 厭惡的,當然有些人不看直接安裝,而有些人可能會覺得會偷偷發簡訊喔,好噁心的應用,我才不裝咧, 又或者直接禁止我們的APP發送簡訊,那麼當我們APP在發送簡訊的時候就可能會出現一些異常,或者 應用直接崩潰等!所以如果你的應用需要發送簡訊進行驗證或者付費這些東西的話,建議使用這種方式!

核心代碼

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


2.調用系統提供的簡訊介面發送簡訊


這個就需要發簡訊的許可權啦

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

我們直接調用SmsManager為我們提供的簡訊介面發送簡訊:

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

參數依次是:

  • destinationAddress

    :收信人的電話號碼
  • scAddress

    :簡訊中心的號碼,null的話使用當前默認的簡訊服務中心

  • text

    :簡訊內容
  • sentIntent

    :簡訊發送狀態的信息:(發送狀態的Intent) 如果不為null,當消息成功發送或失敗這個PendingIntent就廣播。結果代碼是Activity.RESULT_OK 表示成功,或RESULT_ERROR_GENERIC_FAILURE、RESULT_ERROR_RADIO_OFF、RESULT_ERROR_NULL_PDU 之一表示錯誤。對應RESULT_ERROR_GENERIC_FAILURE,sentIntent可能包括額外的"錯誤代碼"包含一 個無線電廣播技術特定的值,通常只在修復故障時有用。每一個基於SMS的應用程序控制檢測sentIntent。 如果sentIntent是空,調用者將檢測所有未知的應用程序,這將導致在檢測的時候發送較小數量的SMS。
  • deliverIntent

    :簡訊是否被對方收到的狀態信息:(接收狀態的Intent) 如果不為null,當這個簡訊發送到接收者那裡,這個PendtingIntent會被廣播, 狀態報告生成的pdu(指對等層次之間傳遞的數據單位)會拓展到數據("pdu")

SmsManager(簡訊管理器)

...那麼複雜,pdu是什麼卵?好吧,別糾結,簡單知道這些參數是:

電話號碼,信息中心,簡訊內容,是否發送成功的監聽,以及收信人是否接受的監聽就好了!

核心代碼

public void sendSMS(String phoneNumber,String message){
//獲取簡訊管理器
android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault();
//拆分簡訊內容(手機簡訊長度限制),貌似長度限制為140個字元,就是
//只能發送70個漢字,多了要拆分成多條簡訊發送
//第四五個參數,如果沒有需要監聽發送狀態與接收狀態的話可以寫null
List<String> divideContents = smsManager.divideMessage(message);
for (String text : divideContents) {
smsManager.sendTextMessage(phoneNumber, null, text, sentPI, deliverPI);
}
}

可能你還需要監聽簡訊是否發送成功,或者收信人是否接收到信息,就把下面的加上吧:

1)處理返回發送狀態的sentIntent

//處理返回的發送狀態
String SENT_SMS_ACTION = "SENT_SMS_ACTION";
Intent sentIntent = new Intent(SENT_SMS_ACTION);
PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, sentIntent, 0);
//註冊發送信息的廣播接收者
context.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context _context, Intent _intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(context, "簡訊發送成功", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE: //普通錯誤
break;
case SmsManager.RESULT_ERROR_RADIO_OFF: //無線廣播被明確地關閉
break;
case SmsManager.RESULT_ERROR_NULL_PDU: //沒有提供pdu
break;
case SmsManager.RESULT_ERROR_NO_SERVICE: //服務當前不可用
break;
}
}
}, new IntentFilter(SENT_SMS_ACTION));

2)處理返回接收狀態的deliverIntent

//處理返回的接收狀態
String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";
//創建接收返回的接收狀態的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,"收信人已經成功接收", Toast.LENGTH_SHORT).show();
}
}, new IntentFilter(DELIVERED_SMS_ACTION));

另外這裡涉及到了廣播的知識,如果你對廣播不怎麼了解的話,可以看下:

Android基礎入門教程——BroadcastReceiver牛刀小試

Android基礎入門教程——4.3.2 BroadcastReceiver庖丁解牛



本節小結:


SmsManager(簡訊管理器)


好的,本節介紹了SmsManager發送文字簡訊的兩種方式~非常簡單~建議還是使用 第一種方案吧,起碼用戶體驗好一點...

SmsManager(簡訊管理器)

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

Paint幾個枚舉/常量值以及ShadowLayer陰影效果
一個製作Web圖案的組件css-doodle

TAG:程序員小新人學習 |