speg03の雑記帳

主に未来の自分のために試したことなどを記録しています

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(通知動作を行うかどうかかな?)が変わっている。