Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android gcmregistar.getRegistrationId(this)始终返回空字符串,即使在成功调用register之后也是如此_Android_Google Cloud Messaging - Fatal编程技术网

Android gcmregistar.getRegistrationId(this)始终返回空字符串,即使在成功调用register之后也是如此

Android gcmregistar.getRegistrationId(this)始终返回空字符串,即使在成功调用register之后也是如此,android,google-cloud-messaging,Android,Google Cloud Messaging,我正在实现GCM—我要做的第一件事是调用gcmregistar.getRegistrationId以查看设备是否已注册。它不是(返回空字符串),所以我对gcmregistar.register进行异步调用。正如预期的那样,my intent服务(源自GCMBaseIntentService)将调用其onRegistered()方法,以及我的服务器可以用来向该设备发送GCM消息的令牌。到目前为止,一切顺利 但是,下次运行应用程序时,我希望对gcmregistar.getRegistrationId

我正在实现GCM—我要做的第一件事是调用gcmregistar.getRegistrationId以查看设备是否已注册。它不是(返回空字符串),所以我对gcmregistar.register进行异步调用。正如预期的那样,my intent服务(源自GCMBaseIntentService)将调用其onRegistered()方法,以及我的服务器可以用来向该设备发送GCM消息的令牌。到目前为止,一切顺利

但是,下次运行应用程序时,我希望对gcmregistar.getRegistrationId的第一次调用会返回我在intent服务的onRegistered函数中得到的令牌。但是我又得到了空字符串。我认为GCM客户端库(GCM.jar)会将GCM注册id(令牌)保存到私有的SharedReferences对象中——事实上,GCMRegistar类()的文档声明“注意:这个类使用私有的SharedReferences对象来跟踪注册令牌”

我没有注销设备、卸载应用程序或更新版本代码。你知道我遗漏了什么吗?谢谢

注意——这个问题已经在谷歌群组的android gcm标签下发布。网址如下:

马克·墨菲(一个下院议员)对问题的初步诊断确实很有帮助,但还没有具体的结果

更新编辑-这是我的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" />

*类别android:name=“写下您的完整软件包名称”/>”*


在上述清单中提供您的包。

检查您是否调用了
gcmregistar.unregister(此)方法。可能在onDestroy()中??
在我们的案例中,问题在于:)


该方法实际上是从Google services取消注册设备,因此在您打开应用程序并调用注册操作之前,它不会获得令牌

请查看示例应用程序的文档。清单上写着:
      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" />


我也遇到了同样的问题,将服务移到包的根目录解决了问题。不过,这是一个相当愚蠢的解决方案。

还要将GCM权限添加到您的清单中,并验证google gmc密钥

应用程序接收GCM消息。

将从gcminent服务派生的服务类放入应用程序的根包中我的意思是,如果您的应用程序包是,那么您的服务类应该位于该包中,而不是位于应用程序项目的其他包包中。如果getRegistrationId返回空字符串,请确保将所有必需的权限都放在清单文件中,这是因为有时注册到GCM云需要时间。您应该等待在gcminent服务类中触发onRegistration方法

注册后,您将收到registrationID,然后可以对其执行任何操作(很可能您必须将其发送到web数据库,您可以从onRegistration回调方法调用Async)

@凌驾 已注册受保护的void(上下文arg0,字符串arg1){


我仔细检查了AndroidManifest,以确保我们的服务定义正确。最后,我遇到了一个涉及写入共享首选项的问题。

我已将我的完整包名添加到mainfest。“com.myapp.package.name”只是实际程序包名称的替换字符串。如果成功获取设备id,我也会遇到同样的问题..哦,我们也有这个问题…没有任何解决方案吗?相同的问题:成功注册,但只获取带有getRegistrationId()的空字符串.你找到什么了吗?这个答案没有提供任何新的信息,而这个问题的其他答案还没有提供这些信息。
    //Log.i("Registration", arg1.toString());  
    // This is where you need to call your server to record the device registration id.
}