You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android模拟器无法接收Firebase Cloud Messaging(FCM)推送求助

排查Android模拟器无法接收FCM推送的问题

首先,我注意到你的代码和配置里有一个关键错误,先帮你指出来:

你的Java类名是MyFirebaseInstanceService,但在AndroidManifest.xml里注册的服务是.services.MyFirebaseMessagingService——类名完全不匹配!系统根本找不到这个推送服务类,这肯定导致你收不到任何FCM消息。先把Manifest里的服务名改成和实际类一致的,比如如果你的类在services包下,应该是.services.MyFirebaseInstanceService,或者写完整包名com.almohamady.pushnotifications.services.MyFirebaseInstanceService

接下来,我们一步步排查其他可能的问题:

1. 模拟器环境检查

  • 确保你使用的是带Google Play服务的模拟器镜像:FCM依赖Google Play Services,普通的Android模拟器镜像没有这个组件。创建模拟器时选择Pixel系列(比如Pixel 5),API级别选26以上,并且镜像类型是「Google Play」(不是「Google APIs」或「Android」)。
  • 打开模拟器里的Google Play商店,检查是否有Google Play服务的更新,确保它是最新版本。
  • 确认模拟器已连接网络,并且可以正常访问Google服务(比如能打开Google搜索)。

2. Firebase配置验证

  • 检查google-services.json文件是否放在app模块的根目录(不是项目根目录),并且文件里的package_name和你AndroidManifest里的package="com.almohamady.pushnotifications"完全一致。
  • 确认你的build.gradle配置正确:
    • 项目级build.gradle里要包含Google服务插件:
      buildscript {
          dependencies {
              classpath 'com.google.gms:google-services:4.4.0' // 可替换为最新版本
          }
      }
      
    • app模块build.gradle里要添加FCM依赖,并且末尾应用Google服务插件:
      dependencies {
          implementation 'com.google.firebase:firebase-messaging:23.4.0' // 可替换为最新版本
      }
      
      apply plugin: 'com.google.gms.google-services'
      

3. 代码细节修正

  • 添加通知小图标:Android 8.0+(API 26)要求通知必须设置小图标,否则通知可能不会显示在系统托盘里。在你的showNotification方法里,给NotificationCompat.Builder加上:
    notificationBuilder.setSmallIcon(R.drawable.ic_notification) // 替换成你项目中已有的图标资源
    
  • 移除不必要的super.onMessageReceived(remoteMessage):在onMessageReceived方法里,这个父类调用并不是必须的,反而可能干扰自定义逻辑,可以删掉。
  • 检查令牌获取:确保你能在Logcat里看到TOKENFIREBASE标签输出的设备令牌,这说明FCM初始化正常。如果看不到令牌,检查Firebase配置是否正确。

4. 测试推送的正确方式

  • 使用Firebase控制台发送测试消息时,选择「单个设备」,输入你从Logcat获取的设备令牌,然后发送。
  • 区分通知消息数据消息
    • 如果你的应用在前台,两种消息都会触发onMessageReceived
    • 如果应用在后台,纯通知消息会由系统托盘显示,不会触发onMessageReceived;纯数据消息会触发onMessageReceived;混合消息(既有通知又有数据)的通知部分由系统处理,数据部分会在用户点击通知时传递给应用。
  • 测试时可以先发送纯数据消息,这样不管前台后台都能触发onMessageReceived,方便你在Logcat里查看日志。

5. 其他可能的问题

  • 检查模拟器的电池优化设置:确保你的应用没有被设置为电池优化,否则后台可能无法接收推送。在模拟器的「设置」→「电池」→「电池优化」里找到你的应用,设置为「不优化」。
  • 确认没有使用代理:如果模拟器使用了代理,可能无法连接FCM服务器,尝试关闭代理后再测试。

按照上面的步骤逐一排查,尤其是先修正Manifest里的服务类名错误,应该就能解决问题了。

内容的提问来源于stack exchange,提问作者ahmed mohamady

火山引擎 最新活动