Android中使用FCM向所有用户发送首条通知时出错
别担心,这是FCM集成里很容易忽略的一步——你确实需要在AndroidManifest.xml中添加关键配置项,哪怕Gradle配置全对,FCM的客户端初始化、消息接收逻辑都依赖Manifest里的声明。我来给你梳理必须加的内容:
声明FCM消息接收服务
不管你是自定义了消息处理逻辑,还是用默认实现,都得在Manifest里注册FirebaseMessagingService相关服务。如果有自定义的MyFirebaseMessagingService(用来处理通知接收、点击事件等),添加这段代码:<service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>要是还没自定义服务,也建议尽快实现一个,方便后续处理通知的自定义逻辑。
可选但推荐:声明实例ID服务
这个服务用来处理FCM令牌的刷新(比如应用重装、设备重置后令牌变化),添加后能保证推送始终能找到正确的设备:<service android:name=".MyFirebaseInstanceIDService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> </intent-filter> </service>基础权限配置
虽然Gradle会自动合并部分权限,但最好手动确认这两个权限存在:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WAKE_LOCK" />WAKE_LOCK能让设备在休眠时唤醒处理通知,INTERNET则是FCM和服务器通信的基础。Android 8.0+必备:通知通道配置
如果你适配Android 8.0及以上系统,必须配置默认通知通道ID,不然推送通知可能完全不显示:<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id" />记得在
strings.xml里定义对应的通道ID字符串。
你提到日志里有两个错误,大概率是这些配置缺失导致的——比如服务未声明会出现ClassNotFoundException,权限缺失会触发MissingPermission类的错误。可以对照日志信息,对应补上上述配置,应该就能解决推送问题了。
内容的提问来源于stack exchange,提问作者Arturo Aguilera

