● AndroidManifext.xml の設定
・ 必要な permission
・メッセージを登録・受信 (<uses-permission>)
com.google.android.c2dm.permission.RECEIVE
・インターネットの使用 (<uses-permission>)
android.permission.INTERNET
・他のアプリのメッセージ登録・受信防止
(<permission>, <uses-permission>)
applicationPackage + ".permission.C2D_MESSAGE
・Broadcast receiver (<receiver>, <intent-filter>)
(この Intent の <category> は applicationPackage)
com.google.android.c2dm.intent.RECEIVE
com.google.android.c2dm.intent.REGISTRATION
・C2DMフレームワークだけがメッセージを送れるようにする
(<receiver>)
com.google.android.c2dm.permission.SEND
・C2DMがうまく走らないような環境では、
アプリがインストールされないようにする (<uses-sdk>)
android:minSdkVersion="8"
・端末に設定されているアカウントを取得 (<uses-permission>)
android.permission.GET_ACCOUNTS
・ PowerManager WakeLocksの使用を許可
(<uses-permission>)
android.permission.WAKE_LOCK
・CREDENTIALS を使う (<uses-permission>)
android.permission.USE_CREDENTIALS
Sample
- <manifest package="com.example.myapp" ...>
- <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
- <uses-permission android:name="android.permission.INTERNET" />
- <permission android:name="com.example.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
- <uses-permission android:name="com.example.myapp.permission.C2D_MESSAGE" />
- <uses-permission android:name="android.permission.WAKE_LOCK" />
- <uses-permission android:name="android.permission.GET_ACCOUNTS" />
- <uses-permission android:name="android.permission.USE_CREDENTIALS" />
- <receiver android:name=".C2DMReceiver" android:permission="com.google.android.c2dm.permission.SEND">
- <intent-filter>
- <action android:name="com.google.android.c2dm.intent.RECEIVE" />
- <category android:name="com.example.myapp" />
- </intent-filter>
- <intent-filter>
- <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
- <category android:name="com.example.myapp" />
- </intent-filter>
- </receiver>
ChromeToPhone のソースをみたら、MainActivity.java は
android:launchMode="singleTop"
になってた
あとは、c2dm パッケージを使っていて、そのために若干マニフェスト
の書き方が変わっていた。
詳しくは ChromeToPhone のソースを見てください。
chrometophone - Project Hosting on Google Code
● メッセージ登録用の Intent の発行
・Intent : com.google.android.c2dm.intent.REGISTER
・extras1 : Sender ID
・extras2 : Application ID
- Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
- // Application ID (boilerplate)
- registrationIntent.putExtra("app",PendingIntent.getBroadcast(this, 0, new Intent(), 0);
- // Sender ID
- registrationIntent.putExtra("sender", SenderID);
- startService(registrationIntent);
ChromeToPhone Sample では
registrationIntent.setPackage("com.google.android.gsf");
も入ってた。
● メッセージ登録解除の Intent の発行
- Intent unregIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER");
- unregIntent.putExtra("app",PendingIntent.getBroadcast(this, 0, new Intent(), 0));
- startService(unregIntent);
ChromeToPhone Sample では
registrationIntent.setPackage("com.google.android.gsf");
も入ってた。
● メッセージ登録結果の処理
・REGISTRATION Intent は、登録が完了しなかった場合には、
エラー・パラメータを生成する
→ アプリはメッセージ登録を再試行すべき
(1秒後、2秒後、4秒後、8秒後、16秒後…といった、
exponential back offで)
・REGISTRATION Intent エラー
・SERVICE_NOT_AVAILABLE
デバイスが、レスポンスを読むことが出来ないか、
サーバから500/503が返った時
→ アプリは、exponential back offのスタイルで
再試行しなければならない
・ACCOUNT_MISSING
デバイス上に、Google Account がない
・AUTHENTICATION_FAILED
パスワードが違っている
・TOO_MANY_REGISTRATIONS
ユーザが、あまりに多くのアプリを登録している
→ ユーザに他のいくつかのアプリの
アンインストールを要求する
・INVALID_SENDER
Senderのアカウントが認識できない
・PHONE_REGISTRATION_ERROR
Googleへの電話の登録が正しくない
=この電話は現在C2DMをサポートしていない
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) {
- handleRegistration(context, intent);
- }
- else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {
- handleMessage(context, intent);
- }
- }
- private void handleRegistration(Context context, Intent intent) {
- String registration = intent.getStringExtra("registration_id");
- if (intent.getStringExtra("error") != null) {
- // 登録に失敗したら、後で再試行する
- }
- else if (intent.getStringExtra("unregistered") != null) {
- // 登録が解除されたら、新しいメッセージは拒否する
- }
- else if (registration != null) {
- // アプリケーション・サーバにregistration IDを送る
- // これは、別スレッドで行われるべき
- // これが終わってはじめて登録作業は終了
- }
- }
ChromeToPhone だと、Retry 用の Intent の処理も入ってた
- } else if (intent.getAction().equals("com.google.android.c2dm.intent.RETRY")) {
- C2DMessaging.register(context, senderId);
- }
0 件のコメント:
コメントを投稿