如何获取用于推送通知的Android设备令牌?

7
我们翻阅了各种Stackoverflow的问题和答案,并查看了文档和文章,但我们尝试的所有方法,如FirebaseInstanceId和扩展FirebaseMessagingService都导致令牌为空。
目前不清楚如何为用户的设备获取令牌,以便进行推送通知。
请问在2021年,有人能澄清如何获取用户设备令牌吗?
谢谢。
4个回答

5

FireBaseInstanceId已被弃用,文档建议使用FirebaseMessaging获取FCM令牌。 具体来说,方法getToken()的工作方式如下:

Returns the FCM registration token for this Firebase project. This creates a Firebase Installations ID, if one does not exist

因此,为了生成令牌,我认为不必扩展FirebaseMessagingService,只需在任何需要的地方调用它即可。
FirebaseMessaging.getInstance().token.addOnCompleteListener {
        if (!it.isSuccessful) {
            return@addOnCompleteListener
        }
        val token = it.result //this is the token retrieved
    }

不幸的是,这并不起作用,而且这是我们已经尝试过的方法之一。即使在第一次安装和运行时,令牌始终返回null。 - Daveo
这个方法对我来说很有效。我能够从task.result中获取令牌。 - Marty Miller

4

一旦您拥有可用的示例推送通知项目,Java代码如下:

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

来源= https://firebase.google.com/docs/cloud-messaging/android/client

这篇文章介绍了如何向 Android 客户端集成 Firebase 云消息传递(FCM)服务。使用 FCM,您可以发送消息到客户端应用,同时客户端可以在前台或后台接收消息。


3
public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onNewToken(String token) {
        super.onNewToken(token);
        Log.e("newToken", token);
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
    }

}

在Android清单文件中添加以下内容:

<service
        android:name=".MyFirebaseMessagingService"
        android:stopWithTask="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
</service>

每当您的应用程序第一次安装并打开时,MyFirebaseMessagingService会被创建并调用onNewToken(String token)方法生成令牌,这个令牌就是您的设备令牌或FCM令牌。

不幸的是,这并不起作用,而且这是我们已经尝试过的方法之一。即使在第一次安装和运行时,令牌始终返回null。 - Daveo
请尝试卸载应用程序,然后重新安装,并确保您从项目控制台获取了最新的google-services.json文件。 - Hascher

-1

通过这种方式,您可以获取唯一的设备ID。

TelephonyManager telephonyManager;
telephonyManager = (TelephonyManager) getSystemService(Context.
                TELEPHONY_SERVICE);

getDeviceId() 将返回唯一的设备ID。

String deviceId = telephonyManager.getDeviceId();

顺便提一下,这需要android.permission.READ_PHONE_STATE的权限。


我们刚刚尝试了这个。有一个警告,即READ_PHONE_STATE仅保留给系统应用程序使用。当忽略此警告运行应用程序时,会导致应用程序在启动时崩溃。 - Daveo

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