2

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 でテストしたことを付け加えておきます。

4

1 に答える 1

0

あなたのライブラリのパッケージは com.sennin だと言っていますが、マニフェストでは、レシーバーとサービスの宣言に com.sennin.app があります。どちらですか。マニフェストで宣言されたレシーバーが存在しないため、開始できないため、不一致が問題を説明している可能性があります。

于 2013-10-11T10:44:39.380 に答える