Dans mon Cordova hybride Android ciblant l'API 23+, je veux utiliser un son personnalisé pour les notifications. À cette fin, j'ai fait ce qui suit
plugin.xml
fichier pour le seul plugin personnalisé que j'utilise dans l'application que je déclare <resource-file src="src/Android/res/unysound.mp3" target="res/raw/mysound.mp3" />'
.Ouverture de l'APK en tant qu'archive Zip Je constate que le fichier mp3 s'est en fait retrouvé dans `res/raw/mysound.mp3 '. - Lors de la création de la notification, je fais ce qui suit
Notification notification = new Notification.Builder(context)
.setDefaults(0) //turns off ALL defaults
.setVibrate(vibrate) /sets to vibrate
....
.setSound(uri).build();
où
Uri uri = Uri.parse("Android.resource://" + ctxt.getPackageName() + "/raw/mysound.mp3");
Cela semble être la recette indiquée dans un certain nombre d'articles que je trouve sur Google et même dans d'autres discussions sur SO. Et pourtant, lorsque j'émets une notification, je n'entends pas le son attendu. Que pourrais-je faire de mal?
La réponse ci-dessous n'aide pas, car dans le cadre de mon application hybride Cordova avec un plugin personnalisé tentant de créer l'APK, une erreur du type class R not known/found...
le code ci-dessous vous aidera:
String CHANNEL_ID="1234";
Uri soundUri = Uri.parse(ContentResolver.SCHEME_Android_RESOURCE + "://"+ getApplicationContext().getPackageName() + "/" + R.raw.mysound);
NotificationManager mNotificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
Pour API 26+, vous devez mettre du code supplémentaire comme ci-dessous:
NotificationChannel mChannel;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mChannel = new NotificationChannel(CHANNEL_ID, Utils.CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
mChannel.setLightColor(Color.GRAY);
mChannel.enableLights(true);
mChannel.setDescription(Utils.CHANNEL_SIREN_DESCRIPTION);
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_NOTIFICATION)
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
.build();
mChannel.setSound(soundUri, audioAttributes);
if (mNotificationManager != null) {
mNotificationManager.createNotificationChannel( mChannel );
}
}
Code général:
NotificationCompat.Builder status = new NotificationCompat.Builder(getApplicationContext(),CHANNEL_ID);
status.setAutoCancel(true)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.logo)
//.setOnlyAlertOnce(true)
.setContentTitle(getString(R.string.app_name))
.setContentText(messageBody)
.setVibrate(new long[]{0, 500, 1000})
.setDefaults(Notification.DEFAULT_LIGHTS )
.setSound(Uri.parse(ContentResolver.SCHEME_Android_RESOURCE+ "://" +mContext.getPackageName()+"/"+R.raw.Apple_ring))
.setContentIntent(pendingIntent)
.setContent(views);
mNotificationManager.notify(major_id, status.build());
où mysound est ma sonnerie qui est placée dans le dossier res/raw.
Note: vous devez seulement mettre le nom de la sonnerie sans extension comme raw/mysound
Pour API 26+, vous devez définir le son sur le canal de notification:
Uri soundUri = Uri.parse(ContentResolver.SCHEME_Android_RESOURCE + "://"+ getApplicationContext().getPackageName() + "/" + R.raw.siren);
NotificationManager mNotificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel mChannel;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mChannel = new NotificationChannel(Utils.CHANNEL_SIREN_ID, Utils.CHANNEL_SIREN_NAME, NotificationManager.IMPORTANCE_HIGH);
mChannel.setLightColor(Color.GRAY);
mChannel.enableLights(true);
mChannel.setDescription(Utils.CHANNEL_SIREN_DESCRIPTION);
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
.build();
mChannel.setSound(soundUri, audioAttributes);
if (mNotificationManager != null) {
mNotificationManager.createNotificationChannel( mChannel );
}
}
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, Utils.CHANNEL_SIREN_ID)
.setSmallIcon(R.drawable.ic_stat_maps_local_library)
.setLargeIcon(BitmapFactory.decodeResource(getApplicationContext().getResources(), R.mipmap.ic_launcher))
.setTicker(title)
.setContentTitle(contentTitle)
.setContentText(contentText)
.setAutoCancel(true)
.setLights(0xff0000ff, 300, 1000) // blue color
.setWhen(System.currentTimeMillis())
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
mBuilder.setSound(soundUri);
}
int NOTIFICATION_ID = 1; // Causes to update the same notification over and over again.
if (mNotificationManager != null) {
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}
Les paramètres sont définis la première fois que vous créez le canal, puis ne sont pas modifiés, sauf si vous le faites manuellement par une nouvelle installation ou l'effacement des données.
Pour plus d'informations à ce sujet, lisez la première réponse ici: La notification Android Oreo continue de faire du son même si je ne règle pas le son. Sur la version plus ancienne, fonctionne parfaitement
vous pouvez appeler cette méthode lors de la gestion des notifications
public void playNotificationSound() {
try {
Uri alarmSound = Uri.parse(ContentResolver.SCHEME_Android_RESOURCE
+ "://" + mContext.getPackageName() + "/raw/notification");
Ringtone r = RingtoneManager.getRingtone(mContext, alarmSound);
r.play();
} catch (Exception e) {
e.printStackTrace();
}
}
Utilisez-le pour régler le son
Uri defaultSoundUri = Uri.parse(ContentResolver.SCHEME_Android_RESOURCE + "://" + mContext.getPackageName() + "/raw/mysound");
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(mContext)
.setContentIntent(mainPIntent)
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.mipmap.ic_launcher))
.setContentTitle("" + title)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentText("" + body);
NotificationManager mNotificationManager =
(NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(title, NOTIFICATION_ID, mBuilder.build());
Vous accédez au son dans un sous-dossier dans les ressources
changer la source de votre uri en
Uri uri = Uri.parse("Android.resource://" + context.getPackageName() + "/" + R.raw.siren);
Pour le son par défaut, utilisez:
notification.defaults |= Notification.DEFAULT_SOUND;
Je ne suis pas sûr mais je pense que le problème est que vous faites le mauvais chemin "/raw/mysound.mp3
:
Uri uri = Uri.parse("Android.resource://" + ctxt.getPackageName() + "/raw/mysound.mp3");
Ajoutez d'abord l'autorisation dans le manifeste: uses-permission Android:name="Android.permission.VIBRATE" />
alors vous pouvez définir le son par défaut comme: -
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
mBuilder.setSound(alarmSound);
et pour les vibrations:
mBuilder.setVibrate(new long[] { 1000, 1000});
pour un son personnalisé, placez le fichier mp3 sur ce chemin: Res\raw\sound.mp3
et alors
Notification notification = builder.build();
notification.sound = Uri.parse("Android.resource://"
+ context.getPackageName() + "/" + R.raw.sound);
Notification.Builder builder = new Notification.Builder(context);
builder.setContentTitle(mTitle);
builder.setContentText(mContentText);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setSound(Settings.System.DEFAULT_NOTIFICATION_URI);
builder.setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 });
builder.setDefaults(Notification.DEFAULT_ALL);
Utilisez-le pour travailler avec le son, j'espère que cela résoudra votre problème, Cheers!