Android8.0 NotificationChannel修改铃声和振动的坑

您所在的位置:网站首页 yourman铃声设置 Android8.0 NotificationChannel修改铃声和振动的坑

Android8.0 NotificationChannel修改铃声和振动的坑

2024-07-01 01:00| 来源: 网络整理| 查看: 265

   记录一下工作中遇到的一些坑,都是一些网上没有找到解决办法自己摸索出来的一些东西。希望让有需要的人少踩一些坑  Android8.0 Google推出了NotificationChannel渠道的概念,对于NotificationChannel我们可以通过以下方式来设置铃声和振动。

NotificationChannel channel = new NotificationChannel(newChannelId, BaseApplication.getAppString(R.string.push_channel_name), NotificationManager.IMPORTANCE_HIGH); if (!TextUtils.isEmpty(uri)) { Logger.i(TAG, "8.0通知铃声:" + uri); Uri mUri = Uri.parse(uri); channel.setSound(mUri, Notification.AUDIO_ATTRIBUTES_DEFAULT); } else { channel.setSound(null, null); } Logger.i(TAG, "8.0是否开启振动:" + vibrateEnable); channel.enableLights(true); if (vibrateEnable) { channel.enableVibration(true); channel.setVibrationPattern(new long[]{ 100, 200, 300 }); } else { channel.enableVibration(false); channel.setVibrationPattern(new long[]{0}); } nm.createNotificationChannel(channel);

那么如何的修改铃声和振动呢?最初天真的我以为重新调用NotificationChannel.setSound()方法来修改铃声,最终结果大家都清楚,是不会生效的,看了google的文档有这样一句话 这里写图片描述 意思是只能在create一个渠道之前修改铃声,在创建之后不支持修改。没办法,只能去重新创建一个渠道设置铃声振动。对于之前创建的渠道,你必须还得去通过deleteNotificationChannel(String channelId)去删除。但是这里又有另外一个坑。你什么时候去删除呢?第一次测试我是在修改铃声或者振动的时候创建一个新的渠道,把之前所有旧的渠道都删除,但是这样会有一个bug,之前渠道上还在状态栏显示的Notification都会删除掉,所有要做一个判断,如果当前渠道在状态栏没有notification显示则删除,否则继续保存,代码如下:

private static void deleteNoNumberNotification(NotificationManager nm, String newChannelId) { List notificationChannels = nm.getNotificationChannels(); if (Utils.isEmpty(notificationChannels) || notificationChannels.size() < 5) { return; } for (NotificationChannel channel : notificationChannels) { if (channel.getId() == null || channel.getId().equals(newChannelId)) { continue; } int notificationNumbers = getNotificationNumbers(nm, channel.getId()); Logger.i(TAG, "notificationNumbers: " + notificationNumbers + " channelId:" + channel.getId()); if (notificationNumbers == 0) { Log.i(TAG, "deleteNoNumberNotification: " + channel.getId()); nm.deleteNotificationChannel(channel.getId()); } } } /** * 获取某个渠道下状态栏上通知显示个数 * * @param mNotificationManager NotificationManager * @param channelId String * @return int */ @RequiresApi(api = Build.VERSION_CODES.O) private static int getNotificationNumbers(NotificationManager mNotificationManager, String channelId) { if (mNotificationManager == null || TextUtils.isEmpty(channelId)) { return -1; } int numbers = 0; StatusBarNotification[] activeNotifications = mNotificationManager.getActiveNotifications(); for (StatusBarNotification item : activeNotifications) { Notification notification = item.getNotification(); if (notification != null) { if (channelId.equals(notification.getChannelId())) { numbers++; } } } return numbers; }

差不多就这样吧,自己摸索的一些东西,记录一下,希望能帮助到大家



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3