我的应用将铃声模式设置为静音但使用Android N我得到java.lang.SecurityException: Not allowed to change Do Not Disturb state
。
我按照此post中的步骤操作,以下代码将打开一个活动,其中包含一个切换按钮,用于启用更改振铃模式的权限。这项活动可以得到支持"从没有启用许可。
Intent intent = new Intent(
android.provider.Settings
.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
startActivity(intent);
问题是我想在尝试使用静音铃声模式功能之前确保授予权限。
我添加了一个CheckBoxPreference来启用和禁用此振铃模式切换。因此,如果选中该复选框,我可以将振铃模式设置为静音,如果不是,我将不会更改振铃模式。
到目前为止,当用户点击复选框时,我设法启动了此权限请求:
disableSoundCheckboxPreference.setOnPreferenceChangeListener(
new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
...
// check for Android N and start the activity mentioned above
但是,只有在授予权限的情况下启用此复选框的正确方法是什么?我想它应该与ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED
和一个监听器有关,但我需要一些想法来实现它。
谢谢!
答案 0 :(得分:2)
我设法解决了这个问题,并会在其他人需要的时候发布答案。
在这种情况下不需要BroadcastListener。您只需在用户首次点击OnPreferenceClickListener
private void requestNotificationPolicyAccess() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && !isNotificationPolicyAccessGranted()) {
Intent intent = new Intent(android.provider.Settings.
ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
startActivity(intent);
如果用户授予权限,当他再次点击时,您将允许用户更改CheckBox
的状态。如果未授予权限,您将继续使用" false"更新CheckBox
。并且可以在其中android:summary
写入必须首先授予许可。您可以通过以下方式进行验证:
private boolean isNotificationPolicyAccessGranted() {
NotificationManager notificationManager = (NotificationManager)
getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
return notificationManager.isNotificationPolicyAccessGranted();
}