[英]Notification sound on API 26
I have a custom mp3 sound that I use on my notifications. 我有一个我在通知中使用的自定义mp3声音。 It works fine on all devices below API 26. I tried to set the sound on Notification Channel also, but still no work.
它适用于API 26以下的所有设备。我也尝试在Notification Channel上设置声音,但仍无法正常工作。 It plays the default sound.
它播放默认声音。
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
.setAutoCancel(true)
.setSmallIcon(R.drawable.icon_push)
.setColor(ContextCompat.getColor(this, R.color.green))
.setContentTitle(title)
.setSound(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.notification))
.setDefaults(Notification.DEFAULT_VIBRATE)
.setStyle(new NotificationCompat.BigTextStyle().bigText(message))
.setContentText(message);
Notification notification = builder.build();
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT);
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
.build();
channel.setSound(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.notification), audioAttributes);
notificationManager.createNotificationChannel(channel);
}
notificationManager.notify(1, notification);
You may have created the channel originally with default sound. 您可能最初使用默认声音创建了频道。 Once channel is created it cannot be changed.
一旦创建了频道,就无法更改。 You need to either reinstall the app or create channel with new channel ID.
您需要重新安装应用程序或使用新的渠道ID创建渠道。
I used RingtoneManager, and it is work for me. 我使用了RingtoneManager,它对我有用。 Try thius code:
试试thius代码:
NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this);
builder.setSmallIcon(android.R.drawable.ic_dialog_alert);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com/"));
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
builder.setContentIntent(pendingIntent);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
builder.setContentTitle("Notification title");
builder.setContentText("Notification message.");
builder.setSubText("Url link.");
try {
Uri notification = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.custom_ringtone);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
} catch (Exception e) {
e.printStackTrace();
}
NotificationManager notificationManager = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(1, builder.build());
In Oreo you need to create a channel for that. 在奥利奥,您需要为此创建一个频道。 https://developer.android.com/reference/android/app/NotificationChannel.html
https://developer.android.com/reference/android/app/NotificationChannel.html
The default sound overrides any sound. 默认声音会覆盖任何声音。
You need to put this in your code: 你需要把它放在你的代码中:
notification.defaults = Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE;
Reference: 参考:
In addition to the Faxriddin's answer you can determine when you should to turn off the notification sound by checking the importance of the notification channel
and are enabled notifications
parameters. 除了Faxriddin的答案,您还可以通过检查
importance of the notification channel
的importance of the notification channel
来确定何时应关闭通知声音,并are enabled notifications
参数。
NotificationChannel channel = notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID);
if(notificationManager.areNotificationsEnabled() && channel.getImportance() != NotificationManager.IMPORTANCE_NONE) {
try {
Ringtone r = RingtoneManager.getRingtone(ctx, soundUri);
r.play();
} catch (Exception e) { }
}
I've been developing app with similar functionality. 我一直在开发具有类似功能的应用程序。 And as mentioned Paweł Nadolski we have to recreate channel each time to change ringtone.
如前所述PawełNadolski我们每次都要重新创建频道来改变铃声。 For this I wrote helper.
为此我写了帮手。 Hope it can help someone.
希望它可以帮助某人。
@RequiresApi(Build.VERSION_CODES.O)
object ChannelHelper {
// channel id for 8.0 OS version and higher
private const val OREO_CHANNEL_ID = "com.ar.app.notifications"
private const val CHANNEL_ID_PREF = "com.ar.app.notifications_prefs"
@JvmStatic
fun createChannel(context: Context, playSound: Boolean, isVibrated: Boolean, uri: Uri) {
// establish name and importance of channel
val name = context.getString(R.string.main_channel_name)
val importance = if (playSound) {
NotificationManager.IMPORTANCE_DEFAULT
} else {
NotificationManager.IMPORTANCE_LOW
}
// create channel
val channelId = OREO_CHANNEL_ID + UUID.randomUUID().toString()
saveChannelId(context, channelId)
val channel = NotificationChannel(channelId, name, importance).apply {
enableLights(true)
lightColor = Color.GREEN
lockscreenVisibility = Notification.VISIBILITY_PUBLIC
// add vibration
enableVibration(isVibrated)
vibrationPattern = longArrayOf(0L, 300L, 300L, 300L)
// add sound
val attr = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build()
setSound(uri, attr)
}
// register the channel in the system
val notificationManager = context.getSystemService(NotificationManager::class.java)
notificationManager.createNotificationChannel(channel)
}
@JvmStatic
fun rebuildChannel(context: Context, playSound: Boolean, isVibrated: Boolean, uri: Uri) {
val notificationManager = context.getSystemService(NOTIFICATION_SERVICE)
as NotificationManager
notificationManager.deleteNotificationChannel(
getChannelId(context) ?: OREO_CHANNEL_ID
)
createChannel(context, playSound, isVibrated, uri)
}
@JvmStatic
fun getChannel(context: Context): NotificationChannel? {
val notificationManager = context.getSystemService(NOTIFICATION_SERVICE)
as NotificationManager
return notificationManager.getNotificationChannel(
getChannelId(context) ?: OREO_CHANNEL_ID
)
}
@JvmStatic
fun isChannelAlreadyExist(context: Context) = getChannel(context) != null
@JvmStatic
fun getChannelId(context: Context) =
PreferenceManager.getDefaultSharedPreferences(context)
.getString(CHANNEL_ID_PREF, OREO_CHANNEL_ID)
private fun saveChannelId(context: Context, channelId: String) =
PreferenceManager.getDefaultSharedPreferences(context)
.edit()
.putString(CHANNEL_ID_PREF, channelId)
.apply()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.