Смена звука уведомления

86
15 января 2021, 18:20

Жму пункт меню:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (!Settings.System.canWrite(getApplicationContext())) {
                        Toast.makeText(getApplicationContext(), getResources().getString(R.string.toast_sys_sett),
                                Toast.LENGTH_LONG).show();
                        Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
                        intent.setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
                        startActivity(intent);
                    } else {
                        pickRingtone();
                    }
                } else {
                    pickRingtone();
                }

Попадаю в метод с интентом:

  public void pickRingtone() {
    Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select Ringtone");
    Uri urie = RingtoneManager.getActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_RINGTONE);
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, urie);
    startActivityForResult(intent, CODE_RESULT_SOUND);
}

Получаю результат:

   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CODE_RESULT_SOUND) {
        if (resultCode == RESULT_OK) {
            Uri uri = null;
            if (resultCode == Activity.RESULT_OK && data != null) {
            uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
            Ringtone ringtone = RingtoneManager.getRingtone(this, uri);
            String title = ringtone.getTitle(this);
        //  Toast.makeText(this, title, Toast.LENGTH_SHORT).show();
            Editor ed = sPref.edit();
            ed.putString("ringtone", title);
            ed.putString("media",uri.toString());
            ed.commit();
            //Toast.makeText(this, sPref.getString("media","DEFAULT_RINGTONE_URI"), Toast.LENGTH_SHORT).show();
            //  ringtone.play();
            }
        }
    }

АлармРесивер:

NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel channel = new NotificationChannel(CHANNEL_ID, context.getResources().getString(R.string.app_name), NotificationManager.IMPORTANCE_HIGH);
                channel.setDescription(context.getResources().getString(R.string.channel_desc));
                channel.enableLights(true);
                channel.enableVibration(true);
                channel.setSound(Uri.parse(sPref.getString("media","DEFAULT_RINGTONE_URI")), new AudioAttributes.Builder()
                        .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                        .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                        .build());
                notificationManager.createNotificationChannel(channel);
                Notification.Builder mBuilder = new Notification.Builder(context,CHANNEL_ID)
                        .setSmallIcon(R.drawable.ic_launcher)
                        .setContentTitle(context.getResources().getString(R.string.notif_text))
                        .setTicker(currentDate)
                        .setAutoCancel(true)
                        .setContentIntent(pendintent)
                        .setContentText(currentDate);
                mBuilder.setAutoCancel(true);
                NotificationManager nNotifManager = (NotificationManager) context
                        .getSystemService(Context.NOTIFICATION_SERVICE);//
                nNotifManager.notify(notifyID, mBuilder.build());
            }
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.ic_launcher)
            .setContentTitle(context.getResources().getString(R.string.notif_text))
            .setTicker(currentDate)
            .setAutoCancel(true)
            .setSound(Uri.parse(sPref.getString("media","DEFAULT_RINGTONE_URI")))
            .setContentIntent(pendintent)
            .setContentText(currentDate);
    mBuilder.setDefaults(Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS);
    mBuilder.setAutoCancel(true);
    NotificationManager nNotifManager = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);//
    nNotifManager.notify(notifyID, mBuilder.build());

В MainActivity:

 Intent intent2 = new Intent(this, AlarmReceiver.class);
    intent2.putExtra("image", Fname);
    PendingIntent pendintent = PendingIntent.getBroadcast(this, 0, intent2, PendingIntent.FLAG_UPDATE_CURRENT);
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    try {
        calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(sPref.getString("hour", "09")));
        calendar.set(Calendar.MINUTE, Integer.parseInt(sPref.getString("minute", "55")));
    } catch (NullPointerException M) {
        calendar.set(Calendar.HOUR_OF_DAY, Hour);
        calendar.set(Calendar.MINUTE, Minute);
    }
    long alarmTime = calendar.getTimeInMillis();
    if (alarmTime < System.currentTimeMillis() + 1000)
        alarmTime += 24 * 60 * 60 * 1000;
    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    am.setRepeating(AlarmManager.RTC_WAKEUP, alarmTime, AlarmManager.INTERVAL_DAY, pendintent);

Проверяю на трех устройствах (планшет 5.1 и два телефона 5.1 и 8.1)

А теперь итоги.

  1. Просто запускаю программу и ничего не делаю. Телефон и планшет с "леденцом" просто жужжат и показывают уведомление, Орео не реагирует вообще.

  2. Меняю в настройках звук уведомления с помощью ТоталКоммандера (выбираю в интенте). Все три устройства реагируют - в назначенное время выдают уведомление со звуком.

  3. Меняю звук с помощью стандартного "Хранилище мультимедиа". См. пункт первый. Причем, для проверки, пробовал одну и ту же мелодию.

  4. Опять пользуюсь Тоталом. И опять начинает работать.

  5. Если раскомментировать строку "ringtone.play();" - звук есть всегда.

6 Лог. Да, я вижу предупреждение "Could not open content...", но не могу понять что от меня требуется - почему external устраивает, а internal - нет.

Ну и, собственно, вопрос: где моя ошибка?

READ ALSO
Картинки и числа Android Studio

Картинки и числа Android Studio

Вот например, у меня есть приложение которое выводит сумму в результате сложения выбранных чисел (из двух дат) , которая по итоге не превышает...

95
Не могу отобразить данные с сервера

Не могу отобразить данные с сервера

Не могу отобразить данные, которые получаю с сервера:

79
Сокращение кода в js

Сокращение кода в js

Можно ли как-то сократить код?

95
Создание объектов, метод forEach для JSON

Создание объектов, метод forEach для JSON

Что происходит в функции(person), можете написать по порядку?

114