android發送短信,以及接收報告和發送報告
android中發送短信其實有兩種方式,這個和打電話類似,大家可以了解一下:
一、調起系統發短信功能
代碼如下:
/** * 調起系統發短信功能 * @param phoneNumber 發送短信的接收號碼 * @param message 短信內容 */ public void SendSMS(String phoneNumber,String message){ Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+phoneNumber)); intent.putExtra("sms_body", message); startActivity(intent); }
二、調用系統短信接口直接發送短信
首先先介紹一下,發送短信相關的api,主要依靠的是
sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) destinationAddress 發送短信的地址(也就是號碼) scAddress 短信服務中心,如果為null,就是用當前默認的短信服務中心 text 短信內容 sentIntent 如果不為null,當短信發送成功或者失敗時,這個PendingIntent會被廣播出去成功的結果代碼是Activity.RESULT_OK,或者下面這些錯誤之一 :RESULT_ERROR_GENERIC_FAILURE,RESULT_ERROR_RADIO_OFF,RESULT_ERROR_NULL_PDU等 通俗點說: 發送 -->中國移動 --> 中國移動發送失敗 --> 返回發送成功或失敗信號 --> 后續處理 即,這個意圖包裝了短信發送狀態的信息 deliveryIntent 如果不為null,當這個短信發送到接收者那里,這個PendtingIntent會被廣播,狀態報告生成的pdu(指對等層次之間傳遞的數據單位)會拓展到數據("pdu") 通俗點就是:發送 -->中國電信 --> 中國電信發送成功 --> 返回對方是否收到這個信息 --> 后續處理 即:這個意圖包裝了短信是否被對方收到的狀態信息(供應商已經發送成功,但是對方沒有收到)。
正式開始操作
1.首先要添加權限!
<uses-permission android:name="android.permission.SEND_SMS" />
2.發送短信的核心代碼:
(1)如果你不需要發送報告,那么直接使用:
/** * 直接調用短信接口發短信,不含發送報告和接受報告 * * @param phoneNumber * @param message */ public void sendSMS(String phoneNumber, String message) { // 獲取短信管理器 android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault(); // 拆分短信內容(手機短信長度限制) List<String> divideContents = smsManager.divideMessage(message); for (String text : divideContents) { smsManager.sendTextMessage(phoneNumber, null, text, null, null); } }
(2)如果你需要發送報告和接收報告,那么我們開始:
我們先定義兩個接受方法,用作接收發送報告以及接收報告
發送報告
//處理返回的發送狀態 String SENT_SMS_ACTION = "SENT_SMS_ACTION"; Intent sentIntent = new Intent(SENT_SMS_ACTION); PendingIntent sendIntent= PendingIntent.getBroadcast(context, 0, sentIntent, 0); // register the Broadcast Receivers 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: break; } } }, new IntentFilter(SENT_SMS_ACTION));
接收報告
//處理返回的接收狀態 String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION"; // create the deilverIntent parameter Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION); PendingIntent backIntent= 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));
發送短信代碼:
/** * 調用短信接口發短信,含接收報告和發送報告 * * @param phoneNumber * @param message */ public void sendSMS(String phoneNumber, String message) { // 獲取短信管理器 android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault(); // 拆分短信內容(手機短信長度限制) List<String> divideContents = smsManager.divideMessage(message); for (String text : divideContents) { smsManager.sendTextMessage(phoneNumber, null, text, sendIntent, backIntent); } }