2010年10月12日

[android] SMSを受信するには

SMS(Short Message Service)を受信するにはSMS_RECEIVEDのブロードキャスト通知を受信します。

IntentFilterの設定
端末がSMSを受信すると"android.provider.Telephony.SMS_RECEIVED"アクションのインテント通知がブロードキャストされます。BroadcastReceiverのインテントフィルターにSMS_RECEIVEDアクションを登録して、SMSの受信通知を受け取ります。

  
    
  


Permissionの設定
SMS_RECEIVEDを受信するにはRECEIVE_SMSのパーミッション、SMSを読み取るにはREAD_SMSのパーミッションが必要です。



BroadcastReceiverの処理
SMS_RECEIVEDインテントのExtra(キー名:"pdus")にメッセージデータが格納されています。Object[]形式でメッセージが複数格納されていますので、for文等でメッセージを単体に分割します。メッセージ単体はPDU(protocol description unit)形式のbyte[]文字列ですのでSmsMessageクラスのcreateFromPdu(bute[] pdu)メソッドを呼び出し、byte[]形式のPDUデータをSmsMessageインスタンスへデコードします。

public class SMSReceiver extends BroadcastReceiver {
  private static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
  private static final String TAG = "SMSReceiver";

  @Override
  public void onReceive(Context context, Intent intent) {
    if (SMS_RECEIVED_ACTION.equals(intent.getAction())) {
      Bundle extras = intent.getExtras();
      if (extras != null) {
        // pduのデコードとログ出力
        // サンプルのためBroadcastReceiverで処理(本来はServiceで)
        Object[] pdus = (Object[]) extras.get("pdus");
        for (Object pdu: pdus) {
          SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
          Log.d(TAG, "from:" + smsMessage.getOriginatingAddress());
          Log.d(TAG, "time:" + Long.toString(smsMessage.getTimestampMillis()));
          Log.d(TAG, "body:" + smsMessage.getMessageBody().replaceAll("\n", "\t"));
        }
      }
    }
  }
}

※SmsMessageクラスはAPIレベル4(Donuts)を境に機能とパスが変更されています(Donuts以降、android.telephony.gsm.SmsMessageはdeprecated)

API Levelクラス備考
Cupcake(3)までandroid.telephony.gsm.SmsMessageGSMのみ
Donuts(4)以降android.telephony.SmsMessageGSMとCDMA

docomoの電源OFF・圏外時着信通知を受信した時のログです
10-12 01:33:18.840: DEBUG/SMSReceiver(5272): from:DoCoMo SMS
10-12 01:33:18.840: DEBUG/SMSReceiver(5272): time:1286814795000
10-12 01:33:18.840: DEBUG/SMSReceiver(5272): body:10/12 01:29     090********

posted by meloncake at 02:05| Comment(1) | TrackBack(0) | Android
この記事へのコメント
へぇ。なかなか面白いなぁ。しかし、SMSを送信することが出来るアプリケーションがほとんど存在しないのがネックだね。

facebook/googleくらいしか見たことがない。海外モノには多いのかもしれないけど。

そもそも日本着のSMSがどーやって飛んできてるのかがナゾである。
Posted by hirush at 2010年10月19日 04:05
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/41242112

この記事へのトラックバック