Android GCM:GCMRegistrar提供空注册ID

时间:2012-07-05 09:17:50

标签: android google-cloud-messaging

我已按照http://developer.android.com/guide/google/gcm/gs.html#server-app在我的应用程序中实施GCM

                    GCMRegistrar.checkDevice(this);
        GCMRegistrar.checkManifest(this);
        if (GCMRegistrar.isRegistered(this)) {
            Log.d(TAG, GCMRegistrar.getRegistrationId(this));
        }
        final String regId = GCMRegistrar.getRegistrationId(this);

        if (regId.equals("")) {
            GCMRegistrar.register(this, sender_id);
            Log.d(TAG, "Registration id :  "+GCMRegistrar.getRegistrationId(this));
        }
            else {
            Log.d("info", "already registered as" + regId);
        }

返回空字符串作为注册ID 还有什么需要获得注册ID ??

12 个答案:

答案 0 :(得分:10)

当设备未成功注册时,会出现空字符串。可能有以下原因 为它 -

  1. 将GCM代码放入应用程序包中。 [您可以使用相同名称的应用程序包制作另一个包]
  2. 正确放置所有权限。

答案 1 :(得分:3)

我还获得了空注册ID并最终修复了它。以下是我的解决方案:

1)检查项目ID。它应该是Google API控制台超链接中显示的12个字符长度(而不是您在项目摘要中指定的项目ID)
2)尝试将 final String regId 更改为 String regId 。我不知道为什么,但它对我有用。

希望它有所帮助。

答案 2 :(得分:1)

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

    if (regId.equals("")) {
        GCMRegistrar.register(this, "YOUR_ACCOUNT");
    } else {
        app.prefs.edit().putString("prefs_googleid", regId).commit();
        GCMRegistrar.setRegisteredOnServer(this, true);
        Log.v(TAG, "Already registered");
    }

然后在你的接收器中等待在onRegistered ovverride中扩展GCMBaseIntentService的回调,你将获得你的ID注册。

无论如何,我在这篇文章之后完全创建了一个使用GCM的应用程序:http://developer.android.com/guide/google/gcm/gs.html

答案 3 :(得分:1)

我遇到了同样的问题,解决方案是:

您需要实现 GCMIntentService (从GCMBaseIntentService扩展)。 并且不要!!! 通过其他方式重命名 GCMIntentService ,这就是我的理由。

答案 4 :(得分:1)

使用与eclipse中的应用程序名称相同的谷歌控制台创建一个新项目帮助我解决了这个问题。

答案 5 :(得分:0)

我还将空字符串作为注册ID并按如下方式解决:

  1. 检查senderId是否正确。
  2. 检查您的设备中是否有活动的Google帐户。
  3. 检查清单文件中是否正确定义了权限。

答案 6 :(得分:0)

确保您在“app_package”中定义了该服务,因为GCMBroadcastReceiver将调用此intent服务

例如

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

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

无法正确定义服务,onRegister将没有回调,并且您的注册ID始终为空

答案 7 :(得分:0)

我的申请遇到了同样的问题。 首先是错误的,是我的GCMIntentService。它必须是你的包的根源。

我将在此处包含我的GCMIntentService的简短片段。请记住,您将在GCMIntentService注册方法

上收到您的registrationID
public class GCMIntentService extends GCMBaseIntentService {

private static final String TAG = "GCMIntentService";

public GCMIntentService() {
    super(CloudMessagingUtility.SENDER_ID);
}

/**
 * Method called on device registered
 **/
@Override
protected void onRegistered(Context context, String registrationId) {
    Log.i(TAG, "Device registered: regId = " + registrationId);

//这里调用您的方法将registrationId发送到您的网络服务器         CloudMessagingUtility.register(context,registrationId);     }

/**
 * Method called on device un registred
 * */
@Override
protected void onUnregistered(Context context, String registrationId) {
    Log.i(TAG, "Device will unregister from Google Cloud Messaging");
    //unregister the device from your own webserver too
    CloudMessagingUtility.unregister(context, registrationId);
}

/**
 * Method called on Receiving a new message
 * */
@Override
protected void onMessage(Context context, Intent intent) {
    Log.i(TAG, "Received message from GCM:");
    String message = "";//TODO handle here the messages!

}

/**
 * Method called on receiving a deleted message
 * */
@Override
protected void onDeletedMessages(Context context, int total) {
    Log.i(TAG, "Received deleted messages notification");
    String message = getString(R.string.gcm_deleted, total);
    displayMessage(context, message);

}

/**
 * Method called on Error
 * */
@Override
public void onError(Context context, String errorId) {
    Log.e(TAG, "Received error: " + errorId);
}

}

你必须在Android中进行正确的配置

e <service android:name=".GCMIntentService" /><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=" your package here" />
        </intent-filter>
    </receiver>

答案 8 :(得分:0)

  

GCMRegistrar.register(this,sender_id); Log.d(TAG,“注册ID:   “+ GCMRegistrar.getRegistrationId(本));

在register()之后直接调用getRegistrationId()是有风险的,因为寄存器可能不会立即返回id。

对于我的情况,我稍后在我的脚本中(按下按钮时)使用:

进行检查
  

boolean registered = GCMRegistrar.isRegistered(this);

如果已注册,则调用GCMRegistrar.getRegistrationId(this));获得注册ID。

答案 9 :(得分:0)

我尝试过Nick Wong的第二个解决方案,我改变了=&gt; public static final String PROPERTY_REG_ID = "registration_id"; to =&gt; public static String PROPERTY_REG_ID = "registration_id";

只是它有效。

答案 10 :(得分:0)

由于GCMRegistrar.getRegistrationId是异步的,我添加了一个计数器来检查regId是否实际为空。如果为空,计数器将仅增加并尝试再次获得注册ID。像100这样的相当大的数字应该足够了。

int counter = 0;
                while (true) {
                    regID = GCMRegistrar.getRegistrationId(this);
                    counter++;
                    if (counter == 100 || regID != null || !regID.equals("")) {
                        break;
                    }
                }

答案 11 :(得分:0)

我已经解决了将用于注册GCMRegistrar.register的项目从项目名称更改为google项目编号