如何实现自定义铃声
最近更新:2023-09-20
展开全部

如何实现自定义铃声

通知和自定义消息均支持自定义铃声,实现方式如下:

消息类型 实现方法 注意事项
通知
1. 客户端创建自定义渠道并设置自定义铃声。2. 服务端指定渠道 ID(channel_id)下发推送。
仅部分厂商通道支持自定义铃声,详情参考 支持通道说明
自定义消息
客户端收到自定义消息回调后,自行处理响铃逻辑。 自定义消息回调依赖极光推送长链接,App 必须在线才可以收到自定义消息,否则无法处理播报逻辑。

支持通道说明

消息类型
通道
备注
通知
  • 极光通道
  • FCM 通道
  • 一加的 OPPO 通道
  • 小米通道
  • 华为通道
  • APNs 通道
  • 小米需要在小米官网上申请并创建。
  • 华为仅 数据处理位置 在海外地区支持 channel id,中国区需下发华为的 sound 和 default_sound 字段设置自定义铃声。
  • 其他通道直接创建带有自定义铃声的 channel,推送时带 channel_id 进行下发。
  • 自定义消息
  • 极光通道
  • 小米通道
  • 华为通道
  • 自定义消息回调依赖极光推送长链接,App 必须在线才可以收到自定义消息。

    从 Android 8.1(API 级别 27)开始,应用程序每秒不能多次发出通知声音。如果您的应用在一秒钟内发布多个通知,它们都会按预期显示,但每秒只有第一个通知发出声音。

    极光/OPPO/FCM 通道通知实现

    客户端设置

    1.在项目工程 src/main/res/raw 下放入声音文件,这个文件对应服务端指定的 sound 字段(适配 8.0 以下系统)。
    2.创建 channel 并设置 sound,详情参考 NotificationChannel 配置

    private void initChannel(){if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); if (nm != null){NotificationChannelGroup notificationChannelGroup = new NotificationChannelGroup("MyGroupId", "自定义通知组"); nm.createNotificationChannelGroup(notificationChannelGroup); NotificationChannel notificationChannel = new NotificationChannel("m_channel123", "自定义通知 1", NotificationManager.IMPORTANCE_HIGH); notificationChannel.setGroup("MyGroupId"); notificationChannel.enableLights(true); notificationChannel.enableVibration(true); notificationChannel.setSound(Uri.parse("android.resource:// 包名 /raw/ 铃声文件名称"), null); nm.createNotificationChannel(notificationChannel); } } }
              private void initChannel(){if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                if (nm != null){NotificationChannelGroup notificationChannelGroup = new NotificationChannelGroup("MyGroupId", "自定义通知组");
                    nm.createNotificationChannelGroup(notificationChannelGroup);
    
                    NotificationChannel notificationChannel = new NotificationChannel("m_channel123", "自定义通知 1", NotificationManager.IMPORTANCE_HIGH);
                    notificationChannel.setGroup("MyGroupId");
                    notificationChannel.enableLights(true);
                    notificationChannel.enableVibration(true);
                    notificationChannel.setSound(Uri.parse("android.resource:// 包名 /raw/ 铃声文件名称"), null); 
    
                    nm.createNotificationChannel(notificationChannel);
                }
            }
        }
    
            
    此代码块在浮窗中显示

    服务端设置

    推送时需要在 notification 下配置 sound 和 channel_id 字段,channel_id 需与客户端 创建的 channel 一致。

    关键字 类型 选项 含义 说明
    sound String 可选 填写 Android 工程中 /res/raw/ 路径下铃声文件名称,无需文件名后缀 注意:针对 Android 8.0 以上,当传递了 channel_id 时,此属性不生效。
    channel_id String 可选 通知栏消息分类 不超过 1000 字节,Android 8.0 开始可以进行 NotificationChannel 配置,这里根据 channel_id 来指定通知栏展示效果。

    示例如下:

    { "notification": { "android": { "alert": "message alert", "title": "title", // 如果 sound 和 channel_id 都有传,那么会以 channel_id 的铃声为准 "sound": "coin", "channel_id": "m_channel123" } } }
              {
        "notification": {
            "android": {
                "alert": "message alert",
                "title": "title",
                // 如果 sound 和 channel_id 都有传,那么会以 channel_id 的铃声为准
                "sound": "coin",
                "channel_id": "m_channel123"
            }
        }
    }
    
            
    此代码块在浮窗中显示

    小米通道通知实现

    自 2023 年 2 月 1 日起,小米推送将消息分为“私信消息”和“公信消息”两个类别,消息类别通过 Channel 区分,且在 Android 8.0 及以上版本的通知效果也是以 Channel 中的效果为准,发送消息时设置自定义铃声将不会生效,需要在新建 Channel 时设置自定义铃声。​

    申请 Channel 方法

    申请方式可参见小米官方文档 channel 申请及接入方法

    服务端处理

    推送时在 notification 下指定 channel_id 字段进行下发。

    推送时指定 options.third_party_channel.xiaomi.channel_id 字段进行下发。

    关键字 类型 选项 含义 父项目 说明
    classification int 可选 消息类型分类 options 极光不对指定的消息类型进行判断或校准,会以开发者自行指定的消息类型适配 Android 厂商通道。不填默认为 0。
  • 0:代表运营消息。
  • 1:代表系统消息。
  • channel_id string 可选 android 通知 channel_id options.third_party_channel.xiaomi
  • 不超过 1000 字节,Android 8.0 开始可以进行 NotificationChannel 配置,这里根据 channel ID 来指定通知栏展示效果。
  • android 下也有 channel_id 字段,对极光通道及支持的厂商通道均生效。
  • 若本字段没有填充,则使用 android 里面定义的 channel id 字段。若本字段有填充,则优先使用本字段。
  • 示例如下:

    { "options": { "classification":1, "third_party_channel": { "xiaomi": { "channel_id": "小米推送平台登记的 channel id" } } } }
              {
        "options": {
            "classification":1,
            "third_party_channel": {
                "xiaomi": {
                    "channel_id": "小米推送平台登记的 channel id"
                }
            }
        }
    }
    
            
    此代码块在浮窗中显示

    华为通道通知实现

    根据消息内容,华为推送将通知分类为服务与通讯、资讯营销两大类别,并对不同类别消息的提醒方式、消息样式进行差异化管理,具体如下:

    消息类型 服务与通讯 资讯营销
    推送内容 包括社交通讯类消息和服务提醒类消息。 包括资讯类消息和营销类消息,指的是运营人员向用户发送的活动信息、内容推荐、资讯等。
    提醒方式(EMUI 10.0 及以上) 锁屏、铃声、振动 静默通知,仅在下拉通知栏展示消息
    消息样式 文本 + 小图 仅有文本
    配置方式 需要向华为申请自分类权益,审核通过后将信任开发者提供的分类信息,消息不经过智能分类。 默认

    注意:2021 年 11 月开始,若您在华为官网申请的应用数据处理位置为中国区时,channel_id 字段无效,所以华为通道仅海外地区可以使用 channel_id 来实自定义铃声。

    • 自定义渠道功能不再适用于 数据处理位置 为中国区的应用,您的推送消息将按照智能分类系统或消息自分类权益确认的消息级别,归类为 服务与通讯类资讯营销类 消息。
    • 静默通知指的是消息到达终端没有震动、铃声、状态栏图标、弹窗和锁屏,只展示在下拉通知栏界面。
    • 用户终端上对应渠道的开关控制和提醒方式决定消息最终提醒方式。

    中国区设置

    若您在华为官网申请的应用数据处理位置为中国区,可以通过服务端首次给应用推送 服务与通讯消息 时,携带 sound 和 default_sound 字段来实现自定义铃声,sound、 default_sound 和 importance 参数都在 option.third_party_channel.huawei 字段下。

    注意:由于铃声是通知渠道的属性,因此铃声仅在首次创建渠道(设置 sound)有效,后续无法修改。

    服务端设置

    关键字 类型 选项 含义 父项目 说明
    classification int 可选 消息类型分类 options 极光不对指定的消息类型进行判断或校准,会以开发者自行指定的消息类型适配 Android 厂商通道。不填默认为 0。
  • 0:代表运营消息。
  • 1:代表系统消息(服务与通讯消息)。
  • sound string 可选 华为自定义铃声 options.third_party_channel.huawei
  • 铃声文件必须存放在应用的 /res/raw 路径下,例如“/res/raw/shake.mp3”,对应 sound 值参数为“/raw/shake”,无需后缀,支持的格式包括 MP3、WAV、MPEG 等。
  • 仅首次给应用推送服务与通讯消息时设置有效,需要配合 default_sound 一起使用。
  • default_sound boolean 可选 华为默认铃声控制开关 options.third_party_channel.huawei 设置自定义铃声时与 sound 字段配合使用,且 default_sound 值设置为 false。注意:由于铃声是通知渠道的属性,因此自定义铃声仅在首次创建渠道(设置 sound)有效,后续无法修改。
  • true:使用系统默认铃声。
  • false:使用 sound 自定义铃声。
  • importance string 可选 华为通知栏消息智能分类 options.third_party_channel.huawei
  • 取值为 "LOW" 时,表示消息为资讯营销类型。
  • 取值为 "NORMAL" 时,表示消息为服务与通讯类型。
  • { "platform": "all", "audience": { "registration_id": ["1104a8979278ae64e75"] }, "notification": { "android": { "alert": "message alert" } }, "options": { "classification":1,//表示消息为服务与通讯类型 "third_party_channel": { "huawei": { "sound":"/raw/shake", "default_sound":false, "importance": "NORMAL"//表示消息为服务与通讯类型 } } } }
              {
        "platform": "all",
        "audience": {
            "registration_id": ["1104a8979278ae64e75"]
        },
        "notification": {
            "android": {
                "alert": "message alert"
            }
        },
        "options": {
            "classification":1,//表示消息为服务与通讯类型
            "third_party_channel": {
                "huawei": {
                    "sound":"/raw/shake",
                    "default_sound":false,
                    "importance": "NORMAL"//表示消息为服务与通讯类型
                }
            }
        }
    }
    
            
    此代码块在浮窗中显示

    海外地区设置

    客户端设置

    若您在华为官网申请的应用数据处理位置为非中国区时,可以使用自定义渠道去设置自定义铃声,客户端设置详情参考 创建自定义渠道

    华为自分类权益申请

    创建渠道后,需要申请服务与通讯类型的通知,申请详情参见 华为消息分类管理方案

    • 若应用没有自分类权益,则应用的推送消息将通过智能分类进行自动归类。
    • 若应用有自分类权益,将信任开发者提供的分类信息,消息不经过智能分类。

    服务端设置

    消息分类的申请审核通过后,即可在 options.third_party_channel.huawei 字段下指定 channel_id 和 importance 参数进行下发。

    关键字 类型 选项 含义 说明
    channel_id string 可选 通知栏消息分类 不超过 1000 字节,Android 8.0 开始可以进行 NotificationChannel 配置,这里根据 channel_id 来指定通知栏展示效果。
    importance string 可选 华为通知栏消息智能分类
  • 取值为 "LOW" 时,表示消息为资讯营销。
  • 取值为 "NORMAL" 时,表示消息为服务与通讯。
  • { "platform": "all", "audience": { "registration_id": ["1104a8979278ae64e75"] }, "notification": { "android": { "alert": "message alert" } }, "options": { "third_party_channel": { "huawei": { "channel_id": "自定义 channel id" "importance": "NORMAL"//表示消息为服务与通讯类型 } } } }
              {
        "platform": "all",
        "audience": {
            "registration_id": ["1104a8979278ae64e75"]
        },
        "notification": {
            "android": {
                "alert": "message alert"
            }
        },
        "options": {
            "third_party_channel": {
                "huawei": {
                    "channel_id": "自定义 channel id"
                    "importance": "NORMAL"//表示消息为服务与通讯类型
                }
            }
        }
    }
    
            
    此代码块在浮窗中显示

    APNs 通道通知实现

    格式要求

    • 格式必须是 Linear PCM、MA4(IMA/ADPCM)、alaw,μLaw 的一种,且时长要求 30s 以下,否则就是系统默认的铃声,详见 官方开发者文档

    客户端设置

    客户端需要将声音文件导入工程里,操作步骤:选中工程 Target -> Build Phrases -> Copy Bundle Resources jpush_ios_v

    服务端设置

    需要指定 iOS 平台下的 sound 参数,具体传入的值是声音文件名+后缀。

    关键字 类型 选项 含义 说明
    sound string 或 JSON Object 可选 铃声 通知提示声音或警告通知。具体说明如下:
  • 普通通知:string 类型。如果无此字段,则此消息无声音提示;有此字段,如果找到了指定的声音就播放该声音,否则播放默认声音。如果此字段为空字符串,iOS 7 为默认声音,iOS 8 及以上系统为无声音。说明:JPush 官方 SDK 会默认填充声音字段,提供另外的方法关闭声音,详情查看各 SDK 的源码。
  • 告警通知:JSON Object。支持官方定义的 payload 结构,在该结构中包含 critical、name 和 volume 等官方支持的 key。
  • { "platform": "all", "audience": { "registration_id": [ "1104a8979278ae64e75" ] }, "notification": { "ios": { "alert": "hello, JPush!", "sound": "sound.caf", } }, "options": { "apns_production": false } }
              {
        "platform": "all",
        "audience": {
            "registration_id": [
                "1104a8979278ae64e75"
            ]
        },
        "notification": {
            "ios": {
                "alert": "hello, JPush!",
                "sound": "sound.caf",
            }
        },
        "options": {
            "apns_production": false
        }
    }
    
            
    此代码块在浮窗中显示

    自定义消息实现

    若需要动态播报自定义铃声,可下发自定义消息,客户端在自定义消息回调中自行处理播放逻辑。

    Android 平台:

    import cn.jpush.android.service.JPushMessageService; public class PushMessageService extends JPushMessageService { private static final String TAG = "PushMessageService"; @Override public void onMessage(Context context, CustomMessage customMessage) {Log.e(TAG,"[onMessage]"+customMessage); // 在此回调中处理播报 }
              import cn.jpush.android.service.JPushMessageService;
    
    public class PushMessageService extends JPushMessageService {
        private static final String TAG = "PushMessageService";
        @Override
        public void onMessage(Context context, CustomMessage customMessage) {Log.e(TAG,"[onMessage]"+customMessage);
            // 在此回调中处理播报
    
      }
    
            
    此代码块在浮窗中显示

    iOS 平台:
    获取 iOS 的推送内容需要在 delegate 类中注册通知并实现回调方法。
    在方法- (BOOL)application:(UIApplication _)application didFinishLaunchingWithOptions:(NSDictionary _) launchOptions 加入下面的代码:

    NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; [defaultCenter addObserver:self selector:@selector(networkDidReceiveMessage:) name:kJPFNetworkDidReceiveMessageNotification object:nil];
              NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
    [defaultCenter addObserver:self selector:@selector(networkDidReceiveMessage:) name:kJPFNetworkDidReceiveMessageNotification object:nil];
    
            
    此代码块在浮窗中显示

    实现回调方法 networkDidReceiveMessage

    - (void)networkDidReceiveMessage:(NSNotification *)notification { NSDictionary * userInfo = [notification userInfo]; NSString *content = [userInfo valueForKey:@"content"]; NSString *messageID = [userInfo valueForKey:@"_j_msgid"]; NSDictionary *extras = [userInfo valueForKey:@"extras"]; NSString *customizeField1 = [extras valueForKey:@"customizeField1"]; //服务端传递的 Extras 附加字段,key 是自己定义的 }
              - (void)networkDidReceiveMessage:(NSNotification *)notification {
        NSDictionary * userInfo = [notification userInfo];
        NSString *content = [userInfo valueForKey:@"content"];
        NSString *messageID = [userInfo valueForKey:@"_j_msgid"];
        NSDictionary *extras = [userInfo valueForKey:@"extras"]; 
        NSString *customizeField1 = [extras valueForKey:@"customizeField1"]; //服务端传递的 Extras 附加字段,key 是自己定义的  
    }
    
            
    此代码块在浮窗中显示
    文档内容是否对您有帮助?

    Copyright 2011-2022, jiguang.cn, All Rights Reserved. 粤ICP备12056275号-13 深圳市和讯华谷信息技术有限公司

    在文档中心打开