J'ai un son mp3 personnalisé que j'utilise dans mes notifications. Cela fonctionne bien sur tous les périphériques ci-dessous API 26. J'ai essayé de définir le son sur Notification Channel également, mais toujours pas de travail. Il joue le son par défaut.
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);
Vous avez peut-être créé le canal à l’origine avec un son par défaut. Une fois le canal créé, il ne peut plus être changé. Vous devez réinstaller l'application ou créer un canal avec un nouvel ID de canal.
J'ai utilisé RingtoneManager, et c'est un travail pour moi. Essayez ce code:
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());
Dans Oreo, vous devez créer un canal pour cela . https://developer.Android.com/reference/Android/app/NotificationChannel.html
Le son par défaut remplace tout son.
Vous devez mettre ceci dans votre code:
notification.defaults = Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE;
Référence:
J'ai développé une application avec des fonctionnalités similaires. Et comme mentionné Paweł Nadolski, nous devons recréer chaque canal pour changer de sonnerie. Pour cela j'ai écrit aide. J'espère que ça peut aider quelqu'un.
@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()
}
En plus de la réponse de Faxriddin, vous pouvez déterminer quand désactiver le son de notification en vérifiant les paramètres importance of the notification channel
et 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) { }
}