NotificationManager所需的权限

时间:2016-12-23 22:30:12

标签: android android-permissions

我正在尝试将振铃器设置为静音且请勿打扰优先级仅使用以下

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:通知策略访问被拒绝

我已将访问通知政策权限添加到我的清单文件

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

我错过了额外的许可吗?

4 个答案:

答案 0 :(得分:2)

似乎用户需要通过设置屏幕明确授予应用程序权限,以便应用程序通过通知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);

希望这有帮助。

答案 1 :(得分:0)

来自Android开发者:

  

通过将用户发送到匹配的活动来请求策略访问权限   系统意图行动ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS

     

使用ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED收听   用户授予或拒绝此访问权限。

因此,要获得权限,您应该通过将用户发送到与系统意图操作ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS匹配的活动来请求策略访问,并使用BroadcastReceiver侦听响应,并执行操作ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED。

另请参阅NotificationManager中的方法isNotificationPolicyAccessGranted()以检查是否授予了权限。

答案 2 :(得分:0)

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

AndroidManifest.xml中添加以下行:

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

答案 3 :(得分:-3)

您需要执行类似

的操作
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
            );
        }
    }
}

请注意,我无法运行此代码,因此可能需要一些TLC,但这只是一个开始