Android 11 NotificationChannel 的自定义声音不起作用
Posted
技术标签:
【中文标题】Android 11 NotificationChannel 的自定义声音不起作用【英文标题】:Custom sound for NotificationChannel for Android 11 not working 【发布时间】:2021-05-02 08:19:42 【问题描述】:在 android 10 之前,我一直使用自定义声音推送通知。从 Android 11 开始,当通知以下拉样式呈现时,附加到通知通道的声音停止播放。当它显示为全屏活动时,它可以工作。
这里是如何创建通知通道的示例源代码
private void createNotificationChannel()
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
String channelId = "media_playback_channel_v_01_1_sound"
String channelName = "Channel High"
NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH);
channel.setDescription("My custom sound");
channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
AudioAttributes.Builder builder = new AudioAttributes.Builder();
builder.setUsage(AudioAttributes.USAGE_NOTIFICATION);
String basePath = ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + getPackageName() + "/" + R.raw.alarm_sound);
Uri alarmSound = Uri.parse(basePath);
channel.setSound(alarmSound, builder.build());
channel.enableVibration(true);
channel.enableLights(true);
channel.setLightColor(Color.RED);
我使用上面的通知通道并按如下方式触发通知:
private void fireNotification(Context context)
String channelId = "media_playback_channel_v_01_1_sound"
NotificationChannel channel = getManager().getNotificationChannel(channelId);
PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(context, 100,
fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT);
String contentText = getString(R.string.call_notification_incoming_from, from);
Bundle args = new Bundle();
args.putInt(CallActivity.INTENT_CALL_NOTIFICATION_ID, ActiveCall.ANDROID_10_PUSH_CALL_NTFN_ID);
args.putBoolean(CallActivity.INTENT_FROM_CALL_NOTIFICATION, true);
args.putString(CallActivity.INTENT_NOTIFICATION_CALL_ID, fullScreenIntent.getStringExtra(CallActivity.INTENT_NOTIFICATION_CALL_ID));
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(this, type)
.setSmallIcon(iconRes)
.setContentTitle(getString(R.string.app_name))
.setContentText(contentText)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_CALL)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setOngoing(true)
.setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_ALL)
.setTimeoutAfter(Consts.MINUTE)
.addExtras(args);
notificationBuilder.addAction(
R.drawable.ic_accept_call,
getString(R.string.call_notification_incoming_answer),
answerPendingIntent);
notificationBuilder.addAction(
R.drawable.ic_decline_bttn,
getString(R.string.call_notification_incoming_reject),
rejectPendingIntent
);
notificationBuilder.setFullScreenIntent(fullScreenPendingIntent, true);
// Build
Notification notification = notificationBuilder.build();
notification.sound = notificationSoundUri;
notification.flags |= (Notification.FLAG_SHOW_LIGHTS | Notification.FLAG_INSISTENT Notification.FLAG_NO_CLEAR);
notification.ledARGB = Color.RED;
notification.ledOnMS = 300;
notification.ledOffMS = 1000;
// Notify
NotificationManager notificationManager = getManager();
notificationManager.notify(id, notification);
请注意,相同的代码会在 Android 10 中播放声音,而在 Android 11 中则不会。
【问题讨论】:
您找到解决方案了吗?我在一些三星和索尼 android 11 设备上看到了这个问题。但不适用于一加和 Pixel。 这方面有什么更新吗?面临完全相同的问题... 我还没有找到解决办法。 【参考方案1】:我也被困在 android 11 上,但我尝试了 不同的 频道名称并且没有频道 ID。
此解决方案适用于所有 android 版本 11 设备。
请试试这个,如果这对你不起作用,请告诉我。
public void showNotification(String title, String message)
count++;
Intent intent = new Intent(this, HomePageActivity.class);
String channel_id = "notification_channel";
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
Uri soundUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + getApplicationContext().getPackageName() + "/" + R.raw.coin);
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), channel_id)
.setSmallIcon(R.mipmap.ic_launcher_round)
.setAutoCancel(true)
.setVibrate(new long[]1000, 1000, 1000, 1000, 1000)
.setOnlyAlertOnce(true)
.setSound(soundUri)
.setContentIntent(pendingIntent);
builder.setNumber(count);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
builder = builder.setContent(getCustomDesign(title, message));
else
builder = builder.setContentTitle(title).setContentText(message).setSmallIcon(R.mipmap.ic_launcher_round);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
NotificationChannel notificationChannel = new NotificationChannel(channel_id, "DIFFRENT_CHANNEL_NAME", NotificationManager.IMPORTANCE_HIGH); // Here I tried put different channel name.
notificationChannel.setShowBadge(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
notificationChannel.canBubble();
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
.build();
notificationChannel.canShowBadge();
notificationChannel.enableVibration(true);
notificationChannel.setSound(soundUri, audioAttributes);
notificationManager.createNotificationChannel(notificationChannel);
notificationManager.notify(0, builder.build());
【讨论】:
我想了解你在这里做了什么。是不是只改成"DIFFRENT_CHANNEL_NAME"
?
是的,我使用了不同的频道名称,但我不知道这对 android 11 是如何工作的以上是关于Android 11 NotificationChannel 的自定义声音不起作用的主要内容,如果未能解决你的问题,请参考以下文章
来自带有 API 30 (android 11) 的三星物理模拟器的错误 Android 11 -> java.net.SocketTimeoutException
Android ActivityResultContracts 请求权限(封装;含android 11权限变更)
Android ActivityResultContracts 请求权限(封装;含android 11权限变更)