在Firebase中,令牌始终为空

8
我正在尝试使用以下简单代码获取令牌,在我的应用程序中使用云消息传递:
String token = FirebaseInstanceId.getInstance().getToken();

我在StackOverflow上搜索了很多人是否遇到过同样的问题,但是没有找到任何解决方法……当然,我已经按照官方谷歌文档的安装步骤(多次)进行了操作,但我的令牌从未生成。

有什么想法为什么我无法获得有效的令牌吗?

谢谢!

2个回答

13

好的,我最终自己找到了解决方案,花费了很多时间才弄清楚,所以我觉得分享解决方案是个好主意,以防其他人遇到同样的问题。

问题出在我在我的AndroidManifest.xml文件中使用了这一行代码(在<application>标签内):

tools:node="replace"

这必须被以下内容移除或更改:

tools:node="merge"
否则,Firebase将无法在您的应用程序中工作。至少,这就是我修复我的应用程序以最终获得有效令牌的方式!希望这能帮助其他人!

1
非常感谢你,你救了我一命。 - Mohamed Atef
对我没用。仍然得到 null。有没有更多的想法? - Ammar Bukhari
@AmmarBukhari:尝试卸载应用程序。研究一下何时获取Firebase令牌以查看:0 - Huy Tower
非常非常非常感谢。 - user1480210
你节省了我大量的时间。 - thanhnd
你太棒了!!我对此感到非常疯狂。现在它可以工作了。但是,你能否请澄清一下为什么它可以工作吗?无论如何,非常感谢! - Chayan C

5

确保你的Firebase "MyFirebaseInstanceIDService.java" 文件直接放在包名为 "com.company" 的树下。

不要将它们放在单独的子包中,如 "com.company.services"。 这是因为你的 google-services.json 将查找直接位于 "com.company" 目录下的文件。

在你的清单文件 application 标签下方的 meta 标签(如果有)中添加以下内容:

   <service
        android:name=".MyFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>

您将在public void onTokenRefresh()方法中获取您的TOKEN。


PS:请确保您的设备日期正确,并拥有来自项目控制台的最新google-services.json


日期应该如何被视为相关的? - Srikar Reddy
请检查“设置”下的“自动日期和时间”是否已启用。关键是您的时间不应该比当前时间早或晚太多。我的时钟曾经超前了3天,就是当我遇到这个问题的时候。 - Dhruv Kaushal
1
我在一个子包中有MyFirebaseInstanceIDService,并且它在com.google.firebase:firebase-messaging:17.6.0中正常工作。 - Borzh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接