2

私はついにアプリがGCM(Google Cloud Messaging)を使用できるようになりました。しかし、私には問題があります。登録が完了した直後に、registrationIdを取得したいと思います。registerIdが空であることを除いて、アプリを再起動しない限り、値が返されます。

基本的に私が欲しいのは、登録が完了した直後にregisterIdを取得することです。

これは私が使用しているコードです:

checkNotNull(SENDER_ID, "SENDER_ID");

GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);

TextView mDisplay = (TextView) findViewById(R.id.display);

String regId = "";

if (!GCMRegistrar.isRegistered(this))
{
    mDisplay.setText("registering");
    GCMRegistrar.register(this, SENDER_ID);

    regId = GCMRegistrar.getRegistrationId(this);
    String url = "localhost/Google-Cloud-Messaging-Server-Test/registration.php?regId=" + regId;

    Log.i(TAG, "registration url: " + url);
    HttpRequest httprequest = new HttpRequest(url);
}
else
{
    regId = GCMRegistrar.getRegistrationId(this);

    mDisplay.setText(regId);
    Log.v(TAG, "Already registered");

    GCMRegistrar.unregister(this);
}

問題は、コードがこのポイントに達した後、次のことです。

regId = GCMRegistrar.getRegistrationId(this);
String url = "localhost/Google-Cloud-Messaging-Server-Test/registration.php?regId=" + regId;

regIdは空です。登録が成功するため、値が必要です。私は何か間違ったことをしていますか?実際に登録プロセスを実行しているときに、registrationIdを取得しようとする可能性はありますか?

よろしくお願いします、
マーク

編集:manifest.xmlコンテンツ

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.codeglue.google.cloud.messaging.test"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="15" />

<permission
    android:name="com.codeglue.google.cloud.messaging.test.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />

<uses-permission android:name="com.codeglue.google.cloud.messaging.test.permission.C2D_MESSAGE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver
        android:name="com.google.android.gcm.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.codeglue.google.cloud.messaging.test" />
        </intent-filter>
    </receiver>

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

</application>

</manifest>
4

2 に答える 2

2
  1. GCMregistrar.register()メソッドcom.google.android.c2dm.intent.REGISTERはインテントを (非同期で) Google に送信します (特にregisterメソッドとinternalRegisterメソッドについては、GCMドキュメントと GCMregistrar ソースの登録を参照してください)。

  2. 次に、Google が Intent を処理し、応答として登録 ID を含む Intentcom.google.android.c2dm.intent.REGISTERを送信します。com.google.android.c2dm.intent.REGISTRATION

  3. 次に、com.google.android.c2dm.intent.REGISTRATIONインテントが Google から (レスポンスに) 送信されると、broadcastReceiver (このタイプのインテントを処理するために登録されている) が呼び出され、その登録 ID が に保存された後でのみ、SharedPreferences.

getRegistrationId()メソッドはSharedPreferences(Google からではなく) デバイスから ID を取得することを思い出してください。つまり、ID を取得する前に、最初SharedPreferencesにそこに保存する必要があります。com.google.android.c2dm.intent.REGISTRATION(そして、IDは、Google から来た場合にのみそこに保存されます)。IDを保存するロジックが正確にどこに配置されているか SharedPreferencesわかりません(答えはGCMRegistrarソースにあるはずです)

そう。あなたのプログラムでは、あなたのregistrationID文字列は次の理由で空です:

  1. GCMRegistrar.getRegistrationIdメソッドの直後にメソッドを呼び出しますGCMRegistrar.registerregisterメソッドは Google にインテントを非同期で送信することに注意してください。つまり、メソッドを呼び出している間はgetRegistrationId、Google からの ID 付きの応答が既に受信されており、ID が に保存されているという保証はありませんSharedPreferences

com.google.android.c2dm.intent.REGISTRATIONIntent が Google から来る瞬間を捉えたい場合は、GCMIntentServiceonRegisteredメソッドを見てください。

于 2012-09-14T15:12:09.180 に答える
0

manifest.xml を確認して、すべての uses-permission と receiver が正しく追加されているかどうかを確認してください。

     <uses-permission android:name="android.permission.INTERNET"/>
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<permission
    android:name="you_package_name.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission
    android:name="you_package_name.permission.C2D_MESSAGE" />
<!-- This app has permission to register and receive data message. -->
<uses-permission
    android:name="com.google.android.c2dm.permission.RECEIVE" />

このレシーバー クラスは、登録用のコードを書き留めた同じパッケージに含まれている必要があります。

 <receiver
        android:name="com.google.android.gcm.GCMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <!-- Receives the actual messages. -->
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <!-- Receives the registration id. -->
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="you_package_name" />
         </intent-filter>
    </receiver>
于 2012-09-11T09:26:57.247 に答える