android oreo上的通知 - 动态启用声音/振动

时间:2017-11-13 07:56:59

标签: android notifications android-8.0-oreo notification-channel

我有一个前台服务,显示进度通知,如果完成,通知将重新用作正常通知,以显示服务的结果

如果最终通知是否无声,我允许用户在我的应用内定义。所以这就是我的工作:

// 1) Create notifcation channel in my app, once only
NotificationChannel notificationChannel = new NotificationChannel(channelId, channelName, importance);
notificationChannel.enableLights(false);
notificationChannel.enableVibration(true);
notificationManager.createNotificationChannel(notificationChannel);

// 2) Init notification
notificationBuilder = new NotificationCompat.Builder(this, notificationChannelId);
notificationBuilder.setAutoCancel(false);
notificationBuilder.setOngoing(true);
notificationBuilder.setTicker(ticker);
notificationBuilder.setContentText(title);

// 3) Updating the notification to show the services progress
notificationBuilder.setContentTitle(title);
notificationBuilder.setContentText(subTitle);

// 4) preparing the final notification
if (!MainApp.getPrefs().silentNotifications()) {
    if (globalError || updated > 0 || prepared > 0 || contactsWithError.size() > 0) {
        notificationBuilder.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE);
        notificationBuilder.setVibrate(new long[]{0, 500});
        notificationBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
    } else {
        notificationBuilder.setVibrate(new long[]{});
        notificationBuilder.setSound(null);
    }
}

问题

  • 一个android oreo用户告诉我,通知是在每次更新时发出声音/振动
  • 同一位用户告诉我,重新启动后,声音/振动消失了

我想要什么

  • 我希望通知频道默认振动并播放声音(如果用户未在我的频道的Android设置中更改此内容)
  • 我想动态决定即使声音/振动已启用也不会播放声音/振动
  • 如果用户为我的频道禁用声音/振动,我很好,我不会在任何时间播放声音或振动

我该如何实现这一目标?

编辑 - 以下是一个解决方案:

使用两个频道:

  • 一个用于更新通知
  • 一个用于最终结果通知。

这对我来说很奇怪,我会假设我可以使用一个频道,默认设置声音并使用此频道。如果用户允许我播放声音,我应该能够定义自己播放声音(似乎我现在被迫播放声音)。否则我当然不会播放声音。看起来目前您需要为每项服务提供两个频道,这些频道会显示通知中的进度,并在完成后默认播放声音。向用户解释是不好的,因为你需要两个通道用于同一个动作,一个用于进度,另一个用于最终结果...

1 个答案:

答案 0 :(得分:0)

我对通知的声音感到恼火。我这样做了

.setSound(Uri.parse("android.resources://" + getPackageName() + "/" + R.raw.silence))

和这个

.setOnlyAlertOnce(true)

另请注意,您还必须在频道中设置它们。