如何讀取收到簡訊

如果想要你的程式能夠讀取收到的簡訊,
利用系統廣播的方式,擷取廣播訊息,
就可以把收到的簡訊,用你想要得呈現方式打開。


廣播還不熟悉的可以參考:
如何使用BroadcastReceiver

例子很簡單,直接完整程式碼呈現

public class SMSBroadcastReceiverDemoActivity extends Activity {
    /** Called when the activity is first created. */
    private final static String MSG_RECEIVED =  
             "android.provider.Telephony.SMS_RECEIVED";
    private Button closeBroadcast;
    private TextView smsContent;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        closeBroadcast = (Button)findViewById(R.id.close_broadcast);
        smsContent = (TextView)findViewById(R.id.sms_content);
        registerReceiver(mBroadcastReceiver,new IntentFilter(MSG_RECEIVED));
        closeBroadcast.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                unregisterReceiver(mBroadcastReceiver);
            } 
        });
    }
    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver(){

        @Override
        public void onReceive(Context arg0, Intent intent) {
            // TODO Auto-generated method stub
            if(intent.getAction().equals(MSG_RECEIVED)){
                Bundle msg = intent.getExtras();
                Object[] messages = (Object[]) msg.get("pdus");
                SmsMessage sms = SmsMessage.createFromPdu((byte[])messages[0]);
               
                StringBuilder strBuilder = new StringBuilder();
                strBuilder.append("From:"+sms.getDisplayOriginatingAddress()+"\n");
                strBuilder.append("text:"+sms.getMessageBody());
                smsContent.setText(strBuilder);                                                           }
        }  
    };
}

跟之前偵測電池資訊那篇差不多,只不過這次不能馬上解除註冊,
因為不知道簡訊何時會傳過來,等到傳過來的時候,
再將註冊解除即可。
closeBroadcast.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        unregisterReceiver(mBroadcastReceiver);
    } 
});


我們一樣擷取系統資訊,簡訊的系統資訊為:
android.provider.Telephony.SMS_RECEIVED

所以就宣告成為一個字串,用來比對是否有擷取到這個訊息,
如果有我們就準備要打開簡訊了。

首先從Bundle取出簡訊,簡訊的識別字是pdus,它是一個物件陣列,
Bundle msg = intent.getExtras();
Object[] messages = (Object[]) msg.get("pdus");

必須使用SmsMessage將陣列的每一列轉成SmsMessage,
由於我們只有要示範傳一封簡訊,因此只取出第一列就可以了,
SmsMessage sms = SmsMessage.createFromPdu((byte[])messages[0]);

然後利用一個字串將傳送訊息的位址以及內容串起來,
StringBuilder strBuilder = new StringBuilder();
strBuilder.append("From:"+sms.getDisplayOriginatingAddress()+"\n");
strBuilder.append("text:"+sms.getMessageBody());

最後丟進TextView就可以看見了。
smsContent.setText(strBuilder); 


當然你想要丟進ListView或者其他的可以呈現文字的方式,也是可以的。

程式碼
http://uploadingit.com/file/cru4jqt2v6auhvzl/SMSBroadcastReceiverDemo.zip