Android 簡訊-接收

上個練習是發送簡訊
即然能發,就要能收
送出簡訊後,在手機端會自動跳出提示







說明:
主程式中沒有什麼特別的
主要是要注冊一個BroadcastReceiver
用於監聽當收到簡訊時,顯示簡訊內容

參考:
SMS_RECEIVED_ACTION
监听SMS消息

注意事項:

  1. uses permission 需要:RECEIVE_SMS
  2. AndroidManifect 需要注冊自訂的BroadcastReceiver
  3. 注冊後intent-filter設定
     <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    用於觸發接收到簡訊的事件
======================================================
<receiver android:name="com.example.sample_11_2.MyBroadcastReceiver">
    <intent-filter >
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>"
======================================================
程式碼:
public class MyBroadcastReceiver extends BroadcastReceiver{
 @Override
 public void onReceive(Context context, Intent intent) {
  if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
   //當接受到簡訊時
   Bundle bundle = intent.getExtras();
   if(bundle != null){
    Object[] myObjects =(Object[]) bundle.get("pdus");
    //protocol description units 標準協定
    //PDU可以是文字或多媒體,用Object陣列全包下來
    
    SmsMessage[] messages = new SmsMessage[myObjects.length];
    
    for(int i =0 ; i< myObjects.length ; i++){

     messages[i] = SmsMessage.createFromPdu((byte[])myObjects[i]);
      //需將PDU格式轉成byte陣列
      //將PDU格式的資料轉為smsMessage的格式
      //由於簡訊長度的限制可能不止一封
    }
    
    StringBuilder sb = new StringBuilder();    
    for(SmsMessage tempMessage : messages){
     sb.append("收到來自:\n\n");
     sb.append(tempMessage.getDisplayOriginatingAddress()+"\n\n");
     sb.append("內容為:\n\n");
     sb.append(tempMessage.getDisplayMessageBody());
    }   
    Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();    
   }
  }  
 }
}

留言

熱門文章