通知に使用するカスタムmp3サウンドがあります。 API 26以下のすべてのデバイスで正常に動作します。通知チャンネルでもサウンドを設定しようとしましたが、まだ動作しません。デフォルトのサウンドを再生します。
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
.setAutoCancel(true)
.setSmallIcon(R.drawable.icon_Push)
.setColor(ContextCompat.getColor(this, R.color.green))
.setContentTitle(title)
.setSound(Uri.parse("Android.resource://" + getPackageName() + "/" + R.raw.notification))
.setDefaults(Notification.DEFAULT_VIBRATE)
.setStyle(new NotificationCompat.BigTextStyle().bigText(message))
.setContentText(message);
Notification notification = builder.build();
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT);
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
.build();
channel.setSound(Uri.parse("Android.resource://" + getPackageName() + "/" + R.raw.notification), audioAttributes);
notificationManager.createNotificationChannel(channel);
}
notificationManager.notify(1, notification);
元々デフォルトのサウンドでチャンネルを作成した可能性があります。一度作成されたチャネルは変更できません。アプリを再インストールするか、新しいチャンネルIDでチャンネルを作成する必要があります。
私はRingtoneManagerを使用しましたが、それは私にとっては役に立ちます。このコードを試してください:
NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this);
builder.setSmallIcon(Android.R.drawable.ic_dialog_alert);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com/"));
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
builder.setContentIntent(pendingIntent);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
builder.setContentTitle("Notification title");
builder.setContentText("Notification message.");
builder.setSubText("Url link.");
try {
Uri notification = Uri.parse("Android.resource://" + getPackageName() + "/" + R.raw.custom_ringtone);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
} catch (Exception e) {
e.printStackTrace();
}
NotificationManager notificationManager = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(1, builder.build());
Oreoでは、そのためのチャネルを作成する必要があります。 https://developer.Android.com/reference/Android/app/NotificationChannel.html
デフォルトのサウンドはすべてのサウンドをオーバーライドします。
これをコードに追加する必要があります。
notification.defaults = Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE;
参照:
同様の機能を備えたアプリを開発しています。また、PawełNadolskiが言及したように、着信音を変更するたびにチャンネルを再作成する必要があります。このために私はヘルパーを書きました。それが誰かを助けることを願っています。
@RequiresApi(Build.VERSION_CODES.O)
object ChannelHelper {
// channel id for 8.0 OS version and higher
private const val OREO_CHANNEL_ID = "com.ar.app.notifications"
private const val CHANNEL_ID_PREF = "com.ar.app.notifications_prefs"
@JvmStatic
fun createChannel(context: Context, playSound: Boolean, isVibrated: Boolean, uri: Uri) {
// establish name and importance of channel
val name = context.getString(R.string.main_channel_name)
val importance = if (playSound) {
NotificationManager.IMPORTANCE_DEFAULT
} else {
NotificationManager.IMPORTANCE_LOW
}
// create channel
val channelId = OREO_CHANNEL_ID + UUID.randomUUID().toString()
saveChannelId(context, channelId)
val channel = NotificationChannel(channelId, name, importance).apply {
enableLights(true)
lightColor = Color.GREEN
lockscreenVisibility = Notification.VISIBILITY_PUBLIC
// add vibration
enableVibration(isVibrated)
vibrationPattern = longArrayOf(0L, 300L, 300L, 300L)
// add sound
val attr = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build()
setSound(uri, attr)
}
// register the channel in the system
val notificationManager = context.getSystemService(NotificationManager::class.Java)
notificationManager.createNotificationChannel(channel)
}
@JvmStatic
fun rebuildChannel(context: Context, playSound: Boolean, isVibrated: Boolean, uri: Uri) {
val notificationManager = context.getSystemService(NOTIFICATION_SERVICE)
as NotificationManager
notificationManager.deleteNotificationChannel(
getChannelId(context) ?: OREO_CHANNEL_ID
)
createChannel(context, playSound, isVibrated, uri)
}
@JvmStatic
fun getChannel(context: Context): NotificationChannel? {
val notificationManager = context.getSystemService(NOTIFICATION_SERVICE)
as NotificationManager
return notificationManager.getNotificationChannel(
getChannelId(context) ?: OREO_CHANNEL_ID
)
}
@JvmStatic
fun isChannelAlreadyExist(context: Context) = getChannel(context) != null
@JvmStatic
fun getChannelId(context: Context) =
PreferenceManager.getDefaultSharedPreferences(context)
.getString(CHANNEL_ID_PREF, OREO_CHANNEL_ID)
private fun saveChannelId(context: Context, channelId: String) =
PreferenceManager.getDefaultSharedPreferences(context)
.edit()
.putString(CHANNEL_ID_PREF, channelId)
.apply()
}
Faxriddinの答えに加えて、importance of the notification channel
およびare enabled notifications
パラメーターを確認することにより、通知音をオフにするタイミングを決定できます。
NotificationChannel channel = notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID);
if(notificationManager.areNotificationsEnabled() && channel.getImportance() != NotificationManager.IMPORTANCE_NONE) {
try {
Ringtone r = RingtoneManager.getRingtone(ctx, soundUri);
r.play();
} catch (Exception e) { }
}