当前位置: 首页 > 知识库问答 >
问题:

我无法从Android GCM获取注册ID

邵骁
2023-03-14

虽然我尝试了关于这个问题的其他答案,但它无法解决。发件人ID正确,权限已添加,API密钥为true。

我使用此帖子创建项目:http://developer.android.com/guide/google/gcm/gs.html#server-应用程序

    GCMRegistrar.checkDevice(this);
    GCMRegistrar.checkManifest(this);
    String regId = GCMRegistrar.getRegistrationId(this);
    if (regId.equals("")) {
      GCMRegistrar.register(this, SENDER_ID);
      regId = GCMRegistrar.getRegistrationId(this);
    } else {
      Log.v(TAG, "Already registered");
    }
    String did = getDeviceID();

它返回空字符串。

共有3个答案

子车鸿运
2023-03-14

我有同样的问题,经过一天的努力,我找到了解决办法。首先,我将与GCM相关的代码放入主包中,并根据androidManifest中的包进行更改。xml

我给你举个简单的例子。我的项目名称是GCME示例,我有三个包1。com.examle.GCME示例(主包),2。com.examle.GCMExample.activity(第二个包),3。com.example.GCMExample.adapter(第三个包)

当我的GCM相关类文件进入我的第二个包时,我没有得到注册标识

我的GCM相关课程如1。GCMinentService,2。服务器实用程序,3。公共设施4。WakeLocker放入我的主包com。实例GCMExample

还有我的雄激素清单。xml

     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.GET_ACCOUNTS" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.VIBRATE" />

     <permission android:name="com.example.GCMExample.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

     <uses-permission android:name="com.example.GCMExample.C2D_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="com.example.GCMExample" />
      </intent-filter>
</receiver>  

<service android:name="com.example.GCMExample.GCMIntentService" />
何向荣
2023-03-14

如果您的应用程序第一次启动,您必须等待GCMIntentService.java文件上的已注册回调。

GCMRegistrar.register(this, SENDER_ID);
// Android does NOT wait for registration ends and executes immediately line below
// So your regId will be empty.
regId = GCMRegistrar.getRegistrationId(this);

GCMIntentService.java:

@Override
protected void onRegistered(Context c, String regId) {
    // You can get it here!
}

编辑:较新版本的GCM库(与google play services库捆绑在一起)等待响应并返回注册ID。因此,此答案适用于较旧的GCM库。

翟善
2023-03-14

您是否在应用程序的根包中正确定义了gcminentservice

<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="my_app_package" />
  </intent-filter>
</receiver>

确保"my_app_package"与应用的主包相同,否则id将返回空字符串。

还要注意

    GCMRegistrar.register(this, "...");

是异步的。因此,调用gcmregistar。getRegistrationId(this)紧跟其后是不可靠的,因此您应该避免它。

ID将通过广播回调到达您的GCMIntentService,作为注册过程的一部分。从那里,您可以将gcm/fcm密钥存储在任何您喜欢的地方,并在应用程序的其他部分(通常是在服务器上)使用它。

 类似资料:
  • 问题内容: 我正在启动我的第一个Node.js服务器。我正在尝试遵循Node.js中的教程。 安装完Node.js并执行后,下一条指令是通过运行启动服务器,这将产生以下错误: 似乎它需要一个名为express的模块,因此我环顾四周,找到了可以解决此问题的命令。但是,出现以下错误: 问题答案: 对于以前跑步的人来说,似乎可以解决该问题

  • 问题内容: 我在机器上安装了docker,并且在其中安装了docker的minikube上,所以可能我有两个在不同VM上运行的docker实例 我建立一个图像并对其进行标记,然后将其推入本地注册表,并成功将其推入,我也可以从注册表中将其拉出,也可以在运行curl以获取标签列表时得到结果,这就是我所做的 以上所有步骤均正常进行,没有任何问题。 我的问题是当我运行minikube并尝试在其中的本地注册

  • 我觉得自己很蠢。我希望K8s从本地注册表中拉出Docker图像,以确保我的开发周期尽可能快。 我已经按照说明设置了本地注册表,并且正在使用一个不安全的注册表。我已经向它推送了图像,并通过使用VS代码的Docker扩展查看注册表内部来确认它们位于注册表中: 我真的不知道是使用、还是,所以我都使用了这三种方法。

  • 我们是否可以通过python客户端获得在Eureka服务器中注册的服务名称和IP? 我查看了python eureka客户端教程页面,但找不到与此相关的任何内容!

  • 我正在我的应用程序中嵌入用于推送通知的GCM。我面临一个非常奇怪的问题,第一次运行时我无法获得GCM注册令牌,但当你第二次运行我的应用程序时,你将在控制台上打印注册ID。我不知道我在干什么。以下是我迄今为止所做的工作。 这是我的onCreate()方法,我想在其中打印GCM注册表: 执行以下代码: 通过以下方法将GCM_regId发送到服务器,如本教程所示: 我不这么认为,这里需要gcminent

  • Eureka服务器配置: 几点思考: 我们从spring boot 1.5.x迁移到2.0.x,安全性有问题吗?我们没有在任何地方使用spring-security,但我读到一些httpendpoint在默认情况下不再是“可到达的”或“活动的”。但我在管理服务器或eureka服务器的日志中没有看到有关此问题的错误或警告。 我的其他应用程序的pom中都没有spring boot admin star