Google FCM推送后台通知铃声自定义

        记录一下工作中遇到的另一个坑,也跟通知有关,这个问题也耗了我完完整整两天的时间,百度google也没有找到完整的解决办法,只能自己摸索。
 在fcm推送sdk10.0.1版本之前,我们可以在FirebaseMessagingService的zzm()方法中进行后台及应用杀掉后的推送处理,在这里我们可以自定义自己的通知铃声和振动设置。由于相关合规的问题在我们必须要把google fcm推送的版本升级,我们目前是15.0.0。在新版本的sdk中google干掉了zzm方法也就是说我们没办法在后台处理我们的推送消息,只能通过点击消息通知进入首页,在首页进行推送消息处理。这样也没问题,稍微改了一下实现上线,一上线两天时间里连续收到了20多个用户反馈推送铃声的问题,亚历山大啊!
       没办法sdk版本号没法改回去只能找其他的方式解决。百度了一波没有找到任何资料,在google上找了一波,发现可以在后台通过setSound(String sound)来传入一个铃声。找后台的兄弟设置了一波一测试发生还是不行。这可急坏了我了,用户的反馈不停的过来,当前晚上觉都没睡好,心想肯定是什么地方出了问题。早上刷牙的时候忽然想到是不是跟Android8.0新增的NotificationChannel渠道概念有关,结果拿7.0的设备测试了一下后台setSound()设置有效果,心想果然是这样。又想到fcm可以在本地设置一个默认的渠道,那么在服务端应该也有一个设置渠道id的方法,找服务端兄弟一查,果然如此。困扰了两天的问题终于有了解决办法;
        总结一下吧,可以通过两种方式处理fcm后台铃声问题。一种是把fcm的sdk版本号设置为10.0.1及以下,在zzm()方法中处理通知铃声(这种方式不推荐,因为fcm版本号迟早都得升级);另外一种就是,8.0以下版本在res/raw内置一套铃声音频,设置完成后把铃声名告诉服务端(ter.mp3只需要设置ter,后缀不需要),服务端通过setSound来实现。在8.0及以上版本,当修改一个铃声或者振动,在本地创建一个新的渠道id,设置设置的铃声与振动,把渠道id告诉服务端,服务端通过setAndroidChannelId()来实现;
      大概就是这些,希望能对大家有帮助。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现 FCM 自定义通知横幅,你需要在客户端和服务器端分别进行以下配置: 客户端配置: 1. 在你的项目级 build.gradle 文件中添加以下依赖: ``` implementation 'com.google.firebase:firebase-messaging:22.0.0' ``` 2. 在你的应用级 build.gradle 文件中添加以下配置: ``` android { // ... defaultConfig { // ... // 设置通道 ID,用于兼容 Android 8.0 及以上版本通知 notificationChannelId "my_channel_id" } } // 在 AndroidManifest.xml 文件中添加以下权限和服务声明 <uses-permission android:name="android.permission.INTERNET" /> <service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <service android:name=".MyFirebaseInstanceIDService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> </intent-filter> </service> ``` 3. 创建一个继承自 FirebaseMessagingService 的服务类,并重写 onMessageReceived 方法,用于处理接收到的消息,如下所示: ``` public class MyFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "MyFirebaseMessagingService"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); // 发送自定义横幅通知 sendCustomNotification(remoteMessage); } } private void sendCustomNotification(RemoteMessage remoteMessage) { // 创建一个 NotificationCompat.Builder 对象 NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "my_channel_id") .setSmallIcon(R.drawable.notification_icon) .setContentTitle(remoteMessage.getNotification().getTitle()) .setContentText(remoteMessage.getNotification().getBody()) .setPriority(NotificationCompat.PRIORITY_HIGH) .setAutoCancel(true); // 添加自定义横幅样式 NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle() .setBigContentTitle(remoteMessage.getNotification().getTitle()) .bigText(remoteMessage.getNotification().getBody()); builder.setStyle(bigTextStyle); // 显示通知 NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(1, builder.build()); } } ``` 服务器端配置: 1. 使用 Firebase 控制台创建一个新的 Firebase 项目,并在项目设置中获取到项目的 Server key。 2. 使用项目的 Server key 发送消息FCM 接口,消息格式如下: ``` { "to": "设备的 FCM token", "notification": { "title": "通知标题", "body": "通知内容" }, "data": { // 自定义数据 } } ``` 这样,当你的应用接收到消息时,就会发送一个自定义横幅通知。需要注意的是,自定义横幅样式只会在 Android 5.0 及以上版本的设备上生效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值