Уведомления об Oreo и пирогах

Проблема: моему приложению нужны уведомления, которые может настроить пользователь. например. установить разные звуки, заголовки, тексты для уведомлений

Проблема: я знаю, что каналы уведомлений устанавливаются только один раз и не могут быть изменены, поэтому я подумал, что могу просто использовать переменные, однако даже с переменными после того, как я выбрал звук, он остается тем же звуком и вообще не может быть изменен. Единственное решение, которое я могу придумать, это новый канал каждый раз, когда что-то меняется, что кажется глупым. Наверняка есть другой способ??

Кроме того, чтобы добавить ко всему этому, на Android Pie звук уведомлений вообще не работает, я не могу понять, почему.

Uri soundUri = Uri.parse(notificationSound);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, "CH_ID")
        .setSmallIcon(R.mipmap.ic_launcher)
        .setContentTitle(customTextTitle)
        .setContentText(customTextBody)
        .setAutoCancel(true)
        .setSound(soundUri)
        .setContentIntent(pendingIntent);

NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {

    if (soundUri != null){
        // Changing Default mode of notification
        notificationBuilder.setDefaults(Notification.DEFAULT_VIBRATE);
        // Creating an Audio Attribute
        AudioAttributes audioAttributes = new AudioAttributes.Builder()
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                .setUsage(AudioAttributes.USAGE_ALARM)
                .build();

        // Creating Channel
        NotificationChannel notificationChannel = new NotificationChannel("CH_ID","Testing_Audio",NotificationManager.IMPORTANCE_HIGH);
        notificationChannel.setSound(soundUri,audioAttributes);
        mNotificationManager.createNotificationChannel(notificationChannel);
    }
}
mNotificationManager.notify(0, notificationBuilder.build());
}

несколько звуков должны поддерживаться несколькими каналами. Создайте другой канал на основе разных звуков.

Rohit5k2 21.02.2019 11:23

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

Nate W 21.02.2019 21:19

Идея канала состоит в том, чтобы позволить пользователю управлять уведомлениями. У вас может быть только ограниченное количество типов уведомлений.

Rohit5k2 22.02.2019 07:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
104
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

у вас неправильно реализовано, установите звук, как показано ниже

notificationBuilder.setSound(soundUri,audioAttributes);

Я пробовал это, но builder.setSound не позволяет мне добавлять аудиоатрибуты, которые он запрашивает для int. Звук работает по-другому, но он просто застревает как этот конкретный звук без настройки пользователем.

Nate W 21.02.2019 21:21
Ответ принят как подходящий

Я решил проблему, хотя и хакерским способом :( В итоге я установил для звука значение null, если >= Oreo, и использовал медиаплеер для воспроизведения звука уведомления, а также установил для audioStream значение STREAM_NOTIFICATION. Очевидно, что это не идеально, но поскольку это уведомление и не сигнал тревоги, звук не должен превышать время, установленное для выполнения задачи во время onReceive.

Единственная проблема, которую я вижу в этом решении, заключается в том, что пользователь решит отключить уведомление/настроить канал на своем телефоне. Отключение звука там, очевидно, не повлияет на звук, воспроизводимый медиаплеером, и, скорее всего, в любом случае будет отображаться как отсутствие звука, что, к сожалению.

 try {
                    mp.setDataSource(context.getApplicationContext(), soundUri);
                    mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
                    mp.prepare();
                    mp.start();
                } catch (Exception e) {
                    //exception caught in the end zone
                }

Для всех, у кого есть эта проблема, я нашел здесь действительно отличный пост, который является тем же решением, что и мое, но более надежным и более глубоким. Android O – Каналы уведомлений – Изменение шаблона вибрации или типа звука

Другие вопросы по теме