12

私はGCMを実装しています-最初に行うことは、GCMRegistrar.getRegistrationIdを呼び出して、デバイスが登録されているかどうかを確認することです。そうではないので(空の文字列が返されます)、GCMRegistrar.registerを非同期で呼び出します。予想どおり、私のインテントサービス(GCMBaseIntentServiceから派生)は、サーバーがこのデバイスにGCMメッセージを送信するために使用できるトークンとともにonRegistered()メソッドを呼び出します。ここまでは順調ですね。

ただし、次にアプリを実行するときは、最初にGCMRegistrar.getRegistrationIdを呼び出して、インテントサービスのonRegistered関数で取得したトークンを返すことを期待しています。しかし、私は再び空の文字列を取得します。GCMクライアントライブラリ(gcm.jar)は、GCM登録ID(トークン)をプライベートSharedPreferencesオブジェクトに保存すると思いました。実際、GCMRegistrarクラスのドキュメント(http://developer.android.com/guide/ google / gcm / client-javadoc / com / google / android / gcm / GCMRegistrar.html)は、「注:このクラスはプライベートSharedPreferencesオブジェクトを使用して登録トークンを追跡します」と述べています。

デバイスの登録を解除したり、アプリケーションをアンインストールしたり、versionCodeを更新したりしていません。私が欠けているアイデアはありますか?ありがとう

注-この質問は、android-gcmタグの下のGoogleグループに投稿されています。URLはここにあります:

https://groups.google.com/forum/#!topic/android-gcm/4FPqZLzlvE4

Mark Murphy(Commons Guy)は問題の初期診断に非常に役立ちましたが、具体的なものは何も表面化されていません。

更新編集-これが私のAndroidManifest.xmlの関連部分です

    <receiver android:name=".push.GCMBroadcastReceiver" 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.myapp.package.name" />
        </intent-filter>
    </receiver>

    <service android:name=".push.GCMIntentService" />
4

7 に答える 7

0

* "category android:name="完全なパッケージ名を書き留めてください" />"*

上記のようにマニフェストでパッケージを提供します。

于 2012-09-13T09:34:13.763 に答える
0

AndroidManifest を再確認して、サービスが適切に定義されていることを確認しました。結局、共有設定への書き込みを含むハックに行きました。

于 2014-05-06T21:16:01.670 に答える
0

getRegistrationId が空の文字列を返す場合、GCM Cloud への登録に時間がかかることがあります。GCMIntent Service クラスで onRegistration メソッドがトリガーされるのを待つ必要があります。

登録が完了すると、registrationID を受け取り、それを使って好きなことを行うことができます (ほとんどの場合、それを Web データベースに送信する必要があります。onRegistration コールバック メソッドから Async を呼び出すことができます)。

@Override protected void onRegistered(Context arg0, String arg1) {

    //Log.i("Registration", arg1.toString());  
    // This is where you need to call your server to record the device registration id.
}
于 2014-05-06T19:49:46.920 に答える
0

GCMRegistrar.unregister(this);アプリが閉じられたときに呼び出されるメソッドをどこかで呼び出したかどうかを確認してください。多分でonDestroy()?? 私たちの場合、それが問題でした:)

このメソッドは実際にデバイスを Google サービスから登録解除するため、アプリを開いて登録アクションを呼び出すまでトークンを取得しません。

于 2013-01-18T15:16:52.977 に答える
0

また、マニフェストに GCM 権限を追加し、Google gmc キーを確認します。

アプリは GCM メッセージを受信します。

于 2014-04-29T06:27:59.850 に答える
0

サンプル アプリのドキュメントを確認してください。マニフェストには次のように書かれています。

      By default, it must be named .GCMIntentService, unless the
      application uses a custom BroadcastReceiver that redefines its name.

使用しているマニフェストで

<service android:name=".push.GCMIntentService" />

このサービスをルート レベルに配置しておらず、カスタム BroadcastReceiver を作成していません。これは次のようになります。

<service android:name=".GCMIntentService" />

私は同じ問題を抱えていました。サービスをパッケージのルートに移動すると問題が解決しました。ただし、これはちょっとばかげた解決策です。

于 2014-04-02T12:39:55.020 に答える