Пользовательский звук уведомлений не работает в Oreo - PullRequest
0 голосов
/ 28 мая 2018
Uri sound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + context.getPackageName() + "/" + R.raw.notification_mp3);
            mBuilder.setSound(sound);

Я скопировал файл mp3 (messages_mp3.mp3) в папку raw в папке res.Когда уведомление запускается, оно воспроизводит звук в формате mp3 до Android Nougat , но звук по умолчанию в Android Oreo .Я ссылался на многие сайты, но ничего не работало на Android Oreo .Я не нашел никаких изменений в Android Docs относительно звука уведомлений в Android O & выше.Какие изменения нужно сделать, чтобы этот код работал и в Android O?

Ответы [ 4 ]

0 голосов
/ 29 мая 2018

Чтобы установить звук для уведомлений в Oreo, необходимо установить звук на NotificationChannel, а не на Notification Builder.Вы можете сделать это следующим образом

Uri sound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + context.getPackageName() + "/" + R.raw.notification_mp3);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

        NotificationChannel mChannel = new NotificationChannel("YOUR_CHANNEL_ID",
            "YOUR CHANNEL NAME",
            NotificationManager.IMPORTANCE_DEFAULT)

        AudioAttributes attributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .build();

        NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, 
                context.getString(R.string.app_name),
                NotificationManager.IMPORTANCE_HIGH);

        // Configure the notification channel.
        mChannel.setDescription(msg);
        mChannel.enableLights(true);
        mChannel.enableVibration(true);
        mChannel.setSound(sound, attributes); // This is IMPORTANT


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

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

if (mNotificationManager != null) {
            List<NotificationChannel> channelList = mNotificationManager.getNotificationChannels();

            for (int i = 0; channelList != null && i < channelList.size(); i++) {
                mNotificationManager.deleteNotificationChannel(channelList.get(i).getId());
            }
        }
0 голосов
/ 28 мая 2018

Android O поставляется с NotificationChannel, который вместо этого

 int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", importance);
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.RED);
            notificationChannel.enableVibration(true);
            notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
            assert mNotificationManager != null;
            mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
            mNotificationManager.createNotificationChannel(notificationChannel);
0 голосов
/ 29 мая 2018

попробуйте это:

/**
 * show notification
 *
 * @param message
 */
private static void showNotification(RemoteMessage message, Context baseContext) {
    Context context = baseContext.getApplicationContext();
    NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context.getApplicationContext());
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context, null)
            .setSmallIcon(R.drawable.ic_logo_xxxdpi)
            .setContentTitle(message.getData().get(TITLE))
            .setContentText(message.getData().get(BODY))
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setAutoCancel(true)
            .setVibrate(new long[]{500, 500})
            .setLights(Color.RED, 3000, 3000)
            .setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
            .setContentIntent(getPendingIntent(context, message));
    managerCompat.notify(getRandom(), builder.build());
}
0 голосов
/ 28 мая 2018

Создать канал (я использую этот метод в Application.clss для создания канала)

  public void initChannels(Context context) {
    if (Build.VERSION.SDK_INT < 26) {
        return;
    }
    NotificationManager notificationManager =
            (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    NotificationChannel channel = new NotificationChannel("default"/*CHANNEL ID*/,
            "CHANNEL_NAME",
            NotificationManager.IMPORTANCE_DEFAULT);
    channel.setDescription("Channel description");
    assert notificationManager != null;
    notificationManager.createNotificationChannel(channel);
}

И использовать этот канал default при создании экземпляра NotificationCompat

 .... notificationBuilder = new NotificationCompat.Builder(this,"default") ....
...