权限需要NotificationManager

问题描述:

我想设置的铃声为静音,使用以下权限需要NotificationManager

AudioManager myAudioMgr = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
NotificationManager myNOtificationMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 

myAudioMgr.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
myNOtificationMgr.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_PRIORITY); 

只有我不断收到安全错误

java.lang中不要打扰到优先级。 RuntimeException:无法启动接收器MyBroadcastReceiver:java.lang.SecurityException:通知策略访问被拒绝

我已经添加了Access通知我的清单文件的政策许可

<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" /> 

我是否缺少额外的权限?

+2

什么版本的Android?我知道在最近的版本中,您需要通过对话框请求权限才能使用。 Manifest权限仅用于旧设备,因此他们可以在市场上显示权限使用情况。 –

+0

最小和目标API是23 – jradich1234

+0

看看这个:https://developer.android.com/training/permissions/requesting.html –

好像用户需要明确地授予通过设置屏幕到App,以使应用程序来操作的优先级/通过通知API无声的权限。我假设你正在使用notificationManager类。一些链接,可以帮助你:

https://developer.android.com/reference/android/provider/Settings.html#ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS

https://developer.android.com/reference/android/app/NotificationManager.html#ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED

我觉得本质上,你需要做的是将用户引导到“显示请勿打扰访问设置”,让他启用选项通知管理(有什么什么,你会为模拟位置例如做类似)

示例代码:

startActivityForResult(new Intent(android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS), 0); 

希望这会有所帮助。

+0

确切的问题!感谢您的帮助! – jradich1234

你需要做的是这样

public class SomeFragment extends FragmentCompat { 
    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     int permissionNotifications = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission. ACCESS_NOTIFICATION_POLICY); 

     if (permissionNotifications != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(
        getActivity(), 
        new String[] { Manifest.permission.ACCESS_NOTIFICATION_POLICY }, 
        PERMISSION_REQUEST 
      ); 
     } 
    } 
} 

记住我不能运行该代码,因此它可能需要一些薄层色谱法,但它是一个开始

+0

ACCESS_NOTIFICATION_POLICY不是危险的许可... – Selvin

+1

错误的答案... – user2511882

+0

@ user2511882我同意显式请求权限不是必需的。当我检查ACCESS_NOTIFICATION_POLICY的ContextCompat.checkSelfPermission时,我得到了PackageManager.PERMISSION_GRANTED。 – jradich1234

从Android开发者:

通过向用户发送匹配 系统意向操作ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS的活动请求策略访问。

使用ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED来监听 用户授予或拒绝此访问。

因此,要获得许可,您应该通过发送用户相匹配的系统意图动作ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS活动请求策略的访问和监听使用广播接收器与行动ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED响应。

而且看一看从NotificationManager方法isNotificationPolicyAccessGranted(),以检查是否同意授予。

要更正java.lang.SecurityException: Access denied to process: 3454错误,必须将android.permission.SET_WALLPAPER权限添加到Android清单。

添加下面一行在你AndroidManifest.xml

uses-permission android:name="android.permission.SET_WALLPAPER"