1.业务逻辑:
通知相关权限包括:允许通知,显示桌面应用角标,悬浮通知,锁屏通知,允许发声,允许振动,允许呼吸灯闪烁。
其中“允许通知”权限是原生接口,默认打开,其余权限均由MIUI实现,默认只有“允许振动”权限打开。
这里要解释下“悬浮通知”和“锁屏通知”权限,并不是打开这两个权限开关后,应用发的通知就会悬浮/在锁屏显示,而是应用发的通知具备了悬浮/在锁屏显示的能力,至于通知最终能否悬浮/在锁屏显示,还需要判定其他的条件。
2.常见问题
Q:如何判断应用/Channel的“允许通知”权限是否打开?
public boolean isNotificationChannelEnabled(Context context, @Nullable String channelId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (!TextUtils.isEmpty(channelId)) {
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel = manager.getNotificationChannel(channelId);
return channel.getImportance() != NotificationManager.IMPORTANCE_NONE;
}
return false;
} else {
return NotificationManagerCompat.from(context).areNotificationsEnabled();
}
}
Q:打开“悬浮通知”权限,应用发的通知没有悬浮显示。
A:打开“悬浮通知”权限,仅代表应用拥有了悬浮显示通知的能力,但通知最终能否悬浮显示,还需要判定其他的条件:通知的重要程度为 IMPORTANCE_HIGH,当前手机处于非勿扰状态,等等。
Q:打开“锁屏通知”权限,应用发的通知没有在锁屏显示。
A:打开“锁屏通知”权限,仅代表应用拥有了在锁屏显示通知的能力,但通知最终能否在锁屏显示,还需要判定其他的条件:通知的重要程度不为 IMPORTANCE_MIN,当前手机没有解锁过,等等。
此外,媒体通知(MediaStyle)会在始终锁屏上显示。
Q:打开应用的“悬浮/锁屏通知”权限,如何让应用的通知不悬浮/在锁屏显示。
A:在 Notification 中提供了两个 extra:
notification.extras.putBoolean("miui.enableFloat", false); // 通知不悬浮显示
notification.extras.putBoolean("miui.enableKeyguard", false); // 通知不在锁屏上显示
Q:打开“允许发声/振动/呼吸灯”权限,通知没有发声/振动/呼吸灯闪烁。
A:同样,打开相应开关仅代表应用具备了相应的能力,最终效果需要查看通知Channel设置。
Q:如何申请相应权限白名单?
A:目前白名单申请仅对内部业务开放。