NotificationManager 所需的权限

Permissions needed for 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: Unable to start receiver MyBroadcastReceiver: java.lang.SecurityException: Notification policy access denied

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

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

我是否缺少额外的权限?

您需要执行类似

的操作
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,但这是一个开始

来自 Android 开发者:

Request policy access by sending the user to the activity that matches the system intent action ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS.

Use ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED to listen for user grant or denial of this access.

因此,要获得许可,您应该通过将用户发送到与系统意图操作 ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS 相匹配的 activity 来请求策略访问权限,并使用具有操作 ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED 的 BroadcastReceiver 监听响应.

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

似乎用户需要通过设置屏幕明确授予应用程序权限,以便应用程序通过通知 api 操纵 priority/silent。我假设您为此使用了 notificationManager class。一些可能对您有帮助的链接:

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

我认为本质上你需要做的是将用户引导至 "Show Do Not Disturb access settings" 并让他启用通知管理选项(例如,你会为模拟位置做些什么)

示例代码:

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

希望这对您有所帮助。

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

在您的 AndroidManifest.xml 中添加以下行:

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