Gmailの受信通知インテントを受け取ってみた
Android端末でGmailのメール受信通知を受け取ってアレコレしたかったので調べたよ。
メール受信時のインテント
端末をPCにつないでLogCatで眺めるだけ。以下のようなインテントを見つけられる。
06-12 20:51:00.550: INFO/Gmail(10262): Sending notification intent: Intent { act=android.intent.action.PROVIDER_CHANGED dat=content://gmail-ls/unread/^iim (has extras) } 06-12 20:51:00.589: INFO/Gmail(10262): Sending notification intent: Intent { act=android.intent.action.PROVIDER_CHANGED dat=content://gmail-ls/unread/^i (has extras) }
PROVIDER_CHANGEDはandroid.content.Intentのリファレンスによるとブロードキャストなのでブロードキャストレシーバを作って受け取ってみた。
メール受信時のブロードキャストレシーバ
以下のような感じ。extrasの中身も見てみる。
AndroidManifest.xmlの一部
<receiver android:name=".Receiver" android:label="receiver"> <intent-filter> <action android:name="android.intent.action.PROVIDER_CHANGED" /> <data android:scheme="content" android:host="gmail-ls" android:path="/unread/^i" /> </intent-filter> </receiver>
Receiver.java
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class Receiver extends BroadcastReceiver { private static final String TAG = "Receiver"; @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "You've Got Mail!!"); for (String key : intent.getExtras().keySet()) { Log.d(TAG, key + ": " + intent.getExtras().get(key)); } } }
実行結果
こんな感じ。
06-12 20:51:00.550: INFO/Gmail(10262): Sending notification intent: Intent { act=android.intent.action.PROVIDER_CHANGED dat=content://gmail-ls/unread/^iim (has extras) } 06-12 20:51:00.589: INFO/Gmail(10262): Sending notification intent: Intent { act=android.intent.action.PROVIDER_CHANGED dat=content://gmail-ls/unread/^i (has extras) } 06-12 20:51:00.601: DEBUG/Receiver(10248): You've Got Mail!! 06-12 20:51:00.601: DEBUG/Receiver(10248): count: 1 06-12 20:51:00.601: DEBUG/Receiver(10248): account: speg03@gmail.com 06-12 20:51:00.601: DEBUG/Receiver(10248): tagLabel: ^^unseen-^i 06-12 20:51:00.601: DEBUG/Receiver(10248): getAttention: true
メールの件数とアカウント名は分かるようだけどタイトルや本文まで取れるのかはわからなかった。2つあるインテントの違いもよくわからない。extrasもtagLabelの末尾にimが付いているかどうかの違いしかなく、他の値は同じようだった。
あと、通知を受信したあとでPC側からそのメールを既読にすると、その変更も同じインテントで通知される。以下がそれ。
06-12 20:53:11.054: INFO/Gmail(10262): Sending notification intent: Intent { act=android.intent.action.PROVIDER_CHANGED dat=content://gmail-ls/unread/^iim (has extras) } 06-12 20:53:11.082: INFO/Gmail(10262): Sending notification intent: Intent { act=android.intent.action.PROVIDER_CHANGED dat=content://gmail-ls/unread/^i (has extras) } 06-12 20:53:11.093: DEBUG/Receiver(10248): You've Got Mail!! 06-12 20:53:11.093: DEBUG/Receiver(10248): count: 0 06-12 20:53:11.093: DEBUG/Receiver(10248): account: speg03@gmail.com 06-12 20:53:11.093: DEBUG/Receiver(10248): tagLabel: ^^unseen-^i 06-12 20:53:11.093: DEBUG/Receiver(10248): getAttention: false
countが減っているのとgetAttention(通知動作を行うかどうかかな?)が変わっている。