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でも機能させるには、どのような変更を行う必要がありますか?
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());
}
}
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);
チャネルを作成します(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") ....
これを試して:
/**
* 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());
}