web-dev-qa-db-ja.com

Oreoでカスタム通知サウンドが機能しない

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

Mp3(notification_mp3.mp3)ファイルをresフォルダーのrawフォルダーにコピーしました。通知がトリガーされると、最大Android Nougatまでのmp3サウンドが生成されますが、デフォルトのサウンドはAndroid Oreoになります。私は多くのサイトを紹介しましたが、何も動作しませんでしたAndroid Oreo。 Android O以上の通知音に関するAndroidドキュメントの変更は見つかりませんでした。このコードをAndroid Oでも機能させるには、どのような変更を行う必要がありますか?

20
Ashish John

Oreoで通知にサウンドを設定するには、Notification Builder自体ではなくNotificationChannelにサウンドを設定する必要があります。次のようにこれを行うことができます

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());
            }
        }
25
Ankush

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
LadyEinstien

チャネルを作成します(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") ....
0
Jay Thummar

これを試して:

/**
 * 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
VIKAS SHARMA