0

現在、アプリに GCM を実装しています。ここのチュートリアルを出発点として使用しました。

問題は、私regIdが常にあることですnull:

GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);

if (regId.equals(""))
{
    GCMRegistrar.register(this, "627xxxx78");
}
else
{
    if (GCMRegistrar.isRegisteredOnServer(this))
    {
        Log.i(TAG, "Already registered regId : " + regId );
    }
    else
    {
        final Context context = this;

        mRegisterTask = new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                boolean registered =
                        ServerUtilities.register(context, regId);

                if (!registered)
                {
                    GCMRegistrar.unregister(context);
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void result) {
                mRegisterTask = null;
            }
        };

        mRegisterTask.execute(null, null, null);
    }
}

上記のコードでは、ServerUtilities.registerが呼び出されることはありません GCMRegistrar.getRegistrationId(this)。常に空の文字列を返します。

何か案は?

4

2 に答える 2

2

私は同じ問題を抱えています。アプリケーション マニフェスト ファイルに次を追加します。

         package="yourApplicationPackage"

      <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
      <uses-permission android:name="android.permission.WAKE_LOCK"/>
     <permission
        android:name="yourApplicationPackage.permission.C2D_MESSAGE"
       android:protectionLevel="signature" />
    <uses-permission
        android:name="yourApplicationPackage.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="yourApplicationPackage" />
         </intent-filter>
    </receiver>
     <service android:name="yourApplicationPackage.GCMIntentService"/>

この「yourApplicationPackage.GCMIntentService」をアプリケーション パッケージに保持する必要があります

yourApplicationPackage.GCMIntentService コードは次のようになります。

     public class GCMIntentService extends GCMBaseIntentService  {


@Override
protected void onError(Context arg0, String arg1) {
    // TODO Auto-generated method stub

}

@Override
protected void onMessage(Context context, Intent intent) {
    // TODO Auto-generated method stub


 }

@Override
protected void onRegistered(Context context, String registrationId) {
    // TODO Auto-generated method stub
      Log.i(TAG, "Device registered: regId = " + registrationId);
     GcmServer.register(context, registrationId);
}

@Override
protected void onUnregistered(Context arg0, String arg1) {
    // TODO Auto-generated method stub

}
于 2012-09-05T17:18:06.123 に答える
2

エミュレーターまたはデバイスが Google アカウントでサインインしていることを確認してください。同じ問題が発生しました。デバイスの Google アカウントにサインインしただけで、regId を取得できました。

于 2013-04-29T14:16:07.597 に答える