如何设置 Android 应用程序以使用 FCM?

Posted

技术标签:

【中文标题】如何设置 Android 应用程序以使用 FCM?【英文标题】:How to setup Android application to use FCM? 【发布时间】:2017-04-20 07:35:06 【问题描述】:

我已经按照教程一步一步完成了,获取json, 添加dependecies (classpath 'com.google.gms:google-services:3.0.0'),apply plugin (apply plugin: 'com.google.gms.google-services'),修改manifest文件。 (不要忘记将这些放入应用程序中,而不是在应用程序之外!

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

创建 firebaseMessagingService 类 (MyFirebaseMessagingService.java)

public class MyFirebaseMessagingService extends FirebaseMessagingService 
private static final String TAG = "FCM Service";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) 
    // TODO: Handle FCM messages here.
    // If the application is in the foreground handle both data and notification messages here.
    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated.
    Log.d(TAG, "From: " + remoteMessage.getFrom());
    Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody());


创建扩展 FirebaseInstanceIdService 的 FirebaseIDService.java

public class FirebaseIDService extends FirebaseInstanceIdService 
private static final String TAG = "FirebaseIDService";

@Override
public void onTokenRefresh() 
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);

    // TODO: Implement this method to send any registration to your app's servers.
    sendRegistrationToServer(refreshedToken);


/**
 * Persist token to third-party servers.
 *
 * Modify this method to associate the user's FCM InstanceID token with any server-side account
 * maintained by your application.
 *
 * @param token The new token.
 */
private void sendRegistrationToServer() 
    // Add custom implementation, as needed.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);


这里是我的主要活动类 sn-p:

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    //FCM
    FirebaseIDService firebaseIDService = new FirebaseIDService();
    MyFirebaseMessagingService myFirebaseMessagingService = new MyFirebaseMessagingService();

然后我从控制台发送推送通知,但没有任何反应。缺少什么部分?或者什么东西不工作?我没有从我创建的两个类中获得任何 logcat 信息

更新: 这是我为解决 Firebase 未链接问题所做的工作: 我需要手动调用该类并获取令牌及其工作

FirebaseIDService firebaseIDService = new FirebaseIDService();
    firebaseIDService.getId();

但是不知何故,推送通知仍然没有到来,我使用的 FCM 类没有给出任何 logcat,有什么想法吗?

更新: 到目前为止,我在收到消息时还没有找到解决方案。扩展 FirebaseMessagingService 的类仍然无法工作,在 logcat 中没有显示任何内容,但它确实显示了如下内容: D/FA: Logging event (FE): _nf, Bundle[_o=fcm, _ndt=0, _nmn=Bayu testing PN,_nmt=1492745322,_nmid=2820998932030178856]

【问题讨论】:

你在 logcat 中得到 refreshToken 了吗? @Bayu Wibawa 不,它不会显示在 logcat 中,我的 mainactivity 类是正确的,不是吗?我只需要在 mainactivity 上创建类来运行 onTokenRefresh 函数,对吧? 从 mainActivity 中删除你的 FirebaseIDService firebaseIDService = new FirebaseIDService(); MyFirebaseMessagingService myFirebaseMessagingService = new MyFirebaseMessagingService(); 行,因为它会自动调用.. 我删除了它,不知何故我在 logcat 上找到了这个:D/FirebaseApp: com.google.firebase.auth.FirebaseAuth 未链接。跳过初始化。这是为什么?这是导致错误的原因吗? 代码看起来没问题。您确定将消息发送到正确的注册令牌? 【参考方案1】:

我现在可以工作了,问题是因为我将服务放在应用程序之外,所以服务必须在应用程序内部,所以 onReceivedMessage 将工作

【讨论】:

请考虑用错误清单的部分更新问题,并在答案中解释错误是什么。所以未来的读者可以从这个问题中学习。【参考方案2】:

你可能跳过了这一步,因为我没有看到你提到它: 在你的模块 Gradle 文件(通常是 app/build.gradle)中,在文件底部添加 apply plugin 行以启用 Gradle 插件:

apply plugin: 'com.android.application'

android 
  // ...


dependencies 
  // ...
  compile 'com.google.firebase:firebase-core:10.2.1'

  // Getting a "Could not find" error? Make sure you have
  // the latest Google Repository in the Android SDK manager


// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'

请注意: compile 'com.google.firebase:firebase-core:10.2.1'

【讨论】:

我忘了提,我添加了这两行: compile 'com.google.firebase:firebase-core:9.2.0' compile 'com.google.firebase:firebase-messaging:9.2. 0',但是当我尝试更改为 10.2.1 时出现错误 将版本号更改为您需要的任何版本,如果出现错误,请在此处发布错误

以上是关于如何设置 Android 应用程序以使用 FCM?的主要内容,如果未能解决你的问题,请参考以下文章

如何构造 FCM 推送通知以在 Flutter(Android 和 iOS)的默认系统 Web 浏览器应用中打开指定的 URL

Firebase(FCM)如何获取令牌

Android Oreo如何知道FCM消息已经到来?

如何在 android 中使用 FCM 发送推送通知? [复制]

当android应用程序注销并与另一个用户登录时如何重新生成新的FCM令牌

无法使用 FCM 解析 Android 通知的符号“NotificationChannel”