En mi aplicación híbrida de Android Cordova dirigida a API 23+, quiero usar un sonido personalizado para las notificaciones. Para ello he hecho lo siguiente

  • En el archivo plugin.xml para el único complemento personalizado que uso en la aplicación, declaro <resource-file src="src/android/res/unysound.mp3" target="res/raw/mysound.mp3" />'.

Al abrir el APK como un archivo zip, veo que el archivo mp3 ha terminado en `res / raw / mysound.mp3 '. - Cuando construyo la notificación hago lo siguiente

    Notification notification = new Notification.Builder(context)
    .setDefaults(0) //turns off ALL defaults
    .setVibrate(vibrate)  /sets to vibrate
    ....
    .setSound(uri).build();

Dónde

Uri uri = Uri.parse("android.resource://" + ctxt.getPackageName() + "/raw/mysound.mp3");

Esta parece ser la receta indicada en varios artículos que encuentro en Google e incluso en otros hilos de SO. Y, sin embargo, cuando emito una notificación, no escucho el sonido esperado. ¿Qué podría estar haciendo mal?


La respuesta a continuación no ayuda, ya que en el contexto de mi aplicación híbrida Cordova con un complemento personalizado que intenta construir el APK, aparece un error en la línea de class R not known/found...

20
DroidOS 26 feb. 2018 a las 13:57

8 respuestas

La mejor respuesta

El código siguiente lo ayudará:

 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); 

  //For API 26+ you need to put some additional code like below:
    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_SONIFICATION)
                        .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                        .build();
                mChannel.setSound(soundUri, audioAttributes);

                if (mNotificationManager != null) {
                    mNotificationManager.createNotificationChannel( mChannel );
                }
        }

   //General code:
     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());

Donde mysound es mi tono de llamada que se coloca en la carpeta res / raw.

Nota : solo tiene que poner el nombre del tono de llamada sin extensión como raw / mysound

22
Ketan Patel 17 feb. 2020 a las 10:24

Use esto para configurar el sonido

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());
1
Ashish Pardhiye 6 mar. 2018 a las 05:24

Está accediendo al sonido en una subcarpeta en los recursos

Cambia la fuente de tu uri a

Uri uri = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.siren);

Para el sonido predeterminado, use:

notification.defaults |= Notification.DEFAULT_SOUND;
0
Lucem 26 feb. 2018 a las 11:39

Para API 26+, debe configurar el sonido en el canal de notificación:

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());
    }
13
Dimitar Darazhanski 25 sep. 2018 a las 20:37

Puedes llamar a este método mientras manejas la notificación

    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();
    }
}
9
Uma Achanta 1 mar. 2018 a las 09:41

No estoy seguro, pero creo que el problema es que estás haciendo lo incorrecto "/raw/mysound.mp3:

Uri uri = Uri.parse("android.resource://" + ctxt.getPackageName() + "/raw/mysound.mp3");

Primero agregue el permiso en manifiesto: uses-permission android:name="android.permission.VIBRATE" /> entonces puede configurar el sonido predeterminado como: -

Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
mBuilder.setSound(alarmSound);

Y para vibración:

mBuilder.setVibrate(new long[] { 1000, 1000});

Para un sonido personalizado, coloque el archivo mp3 en esta ruta: Res\raw\sound.mp3 y entonces

Notification notification = builder.build();
 notification.sound = Uri.parse("android.resource://"
        + context.getPackageName() + "/" + R.raw.sound);
0
aj0822ArpitJoshi 5 mar. 2018 a las 06:28
 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);

Use esto para trabajar con sonido, espero que resuelva su problema, ¡salud!

2
Aleesha Kanwal 7 mar. 2018 a las 07:10
  1. Intente borrar datos (o instalación nueva)
  2. Intentando esto de nuevo

La configuración se establece la primera vez que crea el canal y luego no se modifica a menos que lo haga manualmente mediante una nueva instalación o borrando datos.

Para obtener más información sobre esto, lea la respuesta principal aquí: Android Oreo la notificación sigue haciendo Sonido incluso si no configuro el sonido. En la versión anterior, funciona perfectamente

11
Siddharth Jaswal 24 sep. 2018 a las 07:40