Android уведомление setSound не работает
в моем гибридном Cordova Android App targeting API 23+ я хочу использовать пользовательский звук для уведомлений. С этой целью я сделал следующее
- на 
plugin.xmlфайл для одного пользовательского плагина, который я использую в приложении, я объявляю<resource-file src="src/android/res/unysound.mp3" target="res/raw/mysound.mp3" />'. 
открывая APK как zip-архив, я вижу, что файл mp3 фактически оказался в " res/raw/mysound.mp3'. - При построении уведомления я делаю следующее
    Notification notification = new Notification.Builder(context)
    .setDefaults(0) //turns off ALL defaults
    .setVibrate(vibrate)  /sets to vibrate
    ....
    .setSound(uri).build();
где
Uri uri = Uri.parse("android.resource://" + ctxt.getPackageName() + "/raw/mysound.mp3");
это, по-видимому, рецепт, указанный в ряде статей, которые я нахожу на месте googling и даже в других потоках на SO. И все же, когда я выпускаю уведомление, я не слышу ожидаемого звука. Что я делаю не так?
ответ ниже не помогает, так как в контексте моего гибридного приложения Cordova с пользовательским плагином, пытающимся построить APK, выдает ошибку по строкам class R not known/found...
8 ответов
ниже код поможет вам:
                  NotificationCompat.Builder status = new NotificationCompat.Builder(getApplicationContext());     
                  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);
                NotificationManager mNotificationManager =
                        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                mNotificationManager.notify(major_id, status.build());
где apple_ring - мой рингтон, который помещается в папку res/raw.
Примечание: вы должны только поставить имя мелодии звонка без расширения, как сырье/функция "мой звук"
вы можете вызвать этот метод при обработке уведомления
    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();
    }
}
использовать это для настройки звука
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());
- попробуйте очистить данные (или новая установка)
 - повторите попытку
 
настройки устанавливаются при первом создании канала, а затем не изменяются, если вы не сделаете это вручную с помощью новой установки или очистки данных.
подробнее об этом читай верхний ответ здесь: Android Oreo уведомление держать звук, даже если я не установить звук. На старой версии, работает отлично
для API 26+ вам нужно установить звук на канале уведомлений:
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());
    }
вы получаете доступ к звуку в подпапке в ресурсах
измените источник uri на
Uri uri = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.siren);
для звука по умолчанию, использовать:
notification.defaults |= Notification.DEFAULT_SOUND;
Я не уверен, но я думаю, что проблема в том, что вы делаете неправильно "/raw/mysound.mp3 :
Uri uri = Uri.parse("android.resource://" + ctxt.getPackageName() + "/raw/mysound.mp3");
Сначала добавьте разрешение в манифест:uses-permission android:name="android.permission.VIBRATE" />
затем вы можете установить звук по умолчанию, как: -
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
mBuilder.setSound(alarmSound);
и вибрацию:
mBuilder.setVibrate(new long[] { 1000, 1000});
для пользовательского звука поместите mp3-файл по этому пути:Res\raw\sound.mp3
а потом ... --8-->
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);
используйте это для работы со звуком, я надеюсь, что это решит вашу проблему, Ура!