2010年10月23日

[android] SMSでのWAP PUSHを受信するには

android端末でSMSでのWAP PUSHを受信するには、WAP_PUSH_RECEIVEDのブロードキャスト通知を受信します。

IntentFilterの設定
端末がSMSのWAP_PUSHを受信すると"android.provider.Telephony.WAP_PUSH_RECEIVED"アクションのインテント通知がブロードキャストされます。BroadcastReceiverのインテントフィルターにWAP_PUSH_RECEIVEDアクションを登録して、WAP_PUSHの受信通知を受け取ります。このブロードキャスト処理はcom.android.internal.telephony.WapPushOverSmsクラスのdispatchWapPdu_defaultメソッドから発行されているようです。

  
    
    
  


Permissionの設定
WAP_PUSH_RECEIVEDを受信するにはRECEIVE_WAP_PUSH"のパーミッションが必要です。


BroadcastReceiverの処理
dispatchWapPdu_defaultから発行されたWAP_PUSH_RECEIVEDインテントには以下のExtraデータが格納されています
キー名内容備考
transactionIdPush信号のトランザクションID
pduTypePDUタイプ(Push信号なら0x06)詳細は"WAP-230-WSP-20010705-a"のTable 34(PDU Type Assignments)
headerWSP(Wireless Session Protocol)のヘッダ詳細は"WAP-230-WSP-20010705-a" の8.2.4章(Push and Confirmed Push Facilities)
dataPUSH信号の本体WBXML(Wireless Binary XML)形式

public class WapPushReceiver extends BroadcastReceiver {
  private static final String WAP_PUSH_RECEIVED_ACTION = "android.provider.Telephony.WAP_PUSH_RECEIVED";
  private static final String TAG = "WAP_PUSH";

  @Override
  public void onReceive(Context context, Intent intent) {
    if (WAP_PUSH_RECEIVED_ACTION.equals(intent.getAction())) {
      Bundle extras = intent.getExtras();
      if (extras != null) {
        int transactionId = extras.getInt("transactionId");
        int pduType = extras.getInt("pduType");
        byte[] header = extras.getByteArray("header");
        byte[] data = extras.getByteArray("data");
        
        Log.d(TAG, "contentType: " + ((intent.getType() != null) ? intent.getType() : ""));
        Log.d(TAG, "transactionId: " + Integer.toString(transactionId));
        Log.d(TAG, "pduType: " + Integer.toString(pduType));

        if (header != null) {
          for (int i = 0; i < header.length; i++) {
            Log.d(TAG, String.format("header[%03d]: 0x%02x (%s)", i, header[i], (char) header[i]));
          }
        } else {
          Log.d(TAG, "header is null");
        }

        if (data != null) {
          for (int i = 0; i < data.length; i++) {
            Log.d(TAG, String.format("data[%03d]: 0x%02x (%s)", i, data[i], (char) data[i]));
          }
        } else {
          Log.d(TAG, "data is null");
        }
      }
    }
  }
}

動作ログ
WiFi接続時にiモードのメール受信通知がブロードキャストされた時のログです
10-23 13:10:28.263: DEBUG/WAP_PUSH(22039): contentType: application/vnd.wap.slc
10-23 13:10:28.263: DEBUG/WAP_PUSH(22039): transactionId: 0
10-23 13:10:28.263: DEBUG/WAP_PUSH(22039): pduType: 6
10-23 13:10:28.263: DEBUG/WAP_PUSH(22039): header is null
10-23 13:10:28.273: DEBUG/WAP_PUSH(22039): data[000]: 0x02 ( )
10-23 13:10:28.283: DEBUG/WAP_PUSH(22039): data[001]: 0x06 ( )
10-23 13:10:28.303: DEBUG/WAP_PUSH(22039): data[002]: 0x6a (j)
10-23 13:10:28.313: DEBUG/WAP_PUSH(22039): data[003]: 0x00 ( )
10-23 13:10:28.323: DEBUG/WAP_PUSH(22039): data[004]: 0x85 ( )
10-23 13:10:28.333: DEBUG/WAP_PUSH(22039): data[005]: 0x09 ( )
10-23 13:10:28.343: DEBUG/WAP_PUSH(22039): data[006]: 0x03 ( )
10-23 13:10:28.353: DEBUG/WAP_PUSH(22039): data[007]: 0x64 (d)
10-23 13:10:28.363: DEBUG/WAP_PUSH(22039): data[008]: 0x6f (o)
10-23 13:10:28.373: DEBUG/WAP_PUSH(22039): data[009]: 0x63 (c)
10-23 13:10:28.383: DEBUG/WAP_PUSH(22039): data[010]: 0x6f (o)
10-23 13:10:28.393: DEBUG/WAP_PUSH(22039): data[011]: 0x6d (m)
10-23 13:10:28.403: DEBUG/WAP_PUSH(22039): data[012]: 0x6f (o)
10-23 13:10:28.413: DEBUG/WAP_PUSH(22039): data[013]: 0x2e (.)
10-23 13:10:28.423: DEBUG/WAP_PUSH(22039): data[014]: 0x6e (n)
10-23 13:10:28.433: DEBUG/WAP_PUSH(22039): data[015]: 0x65 (e)
10-23 13:10:28.443: DEBUG/WAP_PUSH(22039): data[016]: 0x2e (.)
10-23 13:10:28.453: DEBUG/WAP_PUSH(22039): data[017]: 0x6a (j)
10-23 13:10:28.463: DEBUG/WAP_PUSH(22039): data[018]: 0x70 (p)
10-23 13:10:28.473: DEBUG/WAP_PUSH(22039): data[019]: 0x3f (?)
10-23 13:10:28.483: DEBUG/WAP_PUSH(22039): data[020]: 0x50 (P)
10-23 13:10:28.493: DEBUG/WAP_PUSH(22039): data[021]: 0x49 (I)
10-23 13:10:28.503: DEBUG/WAP_PUSH(22039): data[022]: 0x3d (=)
10-23 13:10:28.523: DEBUG/WAP_PUSH(22039): data[023]: 0x30 (0)
10-23 13:10:28.533: DEBUG/WAP_PUSH(22039): data[024]: 0x36 (6)
10-23 13:10:28.543: DEBUG/WAP_PUSH(22039): data[025]: 0x00 ( )
10-23 13:10:28.553: DEBUG/WAP_PUSH(22039): data[026]: 0x01 ( )

posted by meloncake at 23:59| Comment(0) | TrackBack(0) | Android