GCM を使用しているライブラリ プロジェクトがあります。gcm.jar を使用せずに非推奨の方法を使用しようとしています。アプリケーション プロジェクト (ライブラリではない) のマニフェストから始めましょう。
ここにパッケージセットがあります
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sennin.app"
ここで許可を作成します。
<permission android:name="com.sennin.app.permission.C2D_MESSAGE" android:protectionLevel="signature" />
そして、ここで私は他の人とそれを使用します:
<uses-permission android:name="com.sennin.app.permission.C2D_MESSAGE"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
レシーバーと IntentService のエントリは次のとおりです。
<receiver android:name="com.sennin.app.SenninGCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.sennin.app" />
</intent-filter>
</receiver>
<service android:name="com.sennin.app.GCMIntentService" />
受信者のアクションは理論的には冗長であることは知っていcom.google.android.c2dm.intent.REGISTRATION
ますが、これは古いデバイスで登録を機能させるためのハックです(ちなみにstackoverflowにあります)。
ライブラリに package があることを追加する必要がありますcom.sennin
。
さて、受信機自体に行きましょう:
public class SenninGCMBroadcastReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("GCM", "RECEIVE GCM");
// Explicitly specify that GcmIntentService will handle the intent.
ComponentName comp = new ComponentName(context.getPackageName(), GCMIntentService.class.getName());
// Start the service, keeping the device awake while it is launching.
startWakefulService(context, (intent.setComponent(comp)));
setResultCode(Activity.RESULT_OK);
}
}
最初の行の onReceive メソッドは、ご覧のとおりですLog
。このログは重要であり、私が望むのはこのログを表示することだけですlogcat
;)
登録はうまくいっているので、メッセージング プロセスの登録部分を省略しました。私はregistration_id
それをサーバーに送信しました。registration_id
サーバーサイトでデータストアに入れました。その後、私はいくつかのメッセージを送信しようとしています。メッセージが送信されたことをサーバー側で確認できます。message_id があり、エラーはありません。すべてがうまくいっているように見えますが、レシーバーが呼び出されることはありません。このログイン方法を見たいonReceive()
のですが、決して起こりません。
明らかな間違いはありますか?多分私はそれを見つけたくないだけです;)
Android 2.3 と Android 4.0.3 でテストしたことを付け加えておきます。