【问题标题】:How do I listen for user grant or denial of Do Not Disturb permission?如何收听用户授予或拒绝“请勿打扰”权限?
【发布时间】:2020-03-19 14:52:23
【问题描述】:

我想向用户请求 ACCESS_NOTIFICATION_POLICY 权限,所以我使用了以下代码:

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
                && !notificationManager.isNotificationPolicyAccessGranted()) {
            //Permission not granted so we will ask for it.
            Intent intent = new Intent(
                    android.provider.Settings
                            .ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
            startActivity(intent);

            //did the user allow the Don't Disturb  permission or just ignore it?

        } else {
            //Permission granted

        }  

但是我如何监听用户授予或拒绝此请求?也许他不允许DND许可,我怎么知道?

【问题讨论】:

    标签: android android-permissions


    【解决方案1】:

    你应该看看Android Request App。有注释的例子可以帮助你理解。

    您完成了请求许可的第一部分,然后您必须使用onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 处理响应

    你可以这样写:

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            NotificationManager mNotificationManager = (NotificationManager) getApplication().getSystemService(Context.NOTIFICATION_SERVICE);
            if (mNotificationManager.isNotificationPolicyAccessGranted()) {
                Log.d("POLICY_PERMISSION", "DND permission granted for Phone.");
            } else {
                Log.d("POLICY_PERMISSION", "DND permission not granted for Phone.");
            }
        }
    

    【讨论】:

    • 但是 ACCESS_NOTIFICATION_POLICY 权限不同,要问这个权限我们使用意图为用户打开一个设置屏幕,我没有调用requestPermissions()
    • 使用ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED 监听用户授予或拒绝此访问权限。
    • 我想使用 ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED 但如何使用? :(
    • 如果不需要,为什么要使用它?这是另一个有类似需求的帖子stackoverflow.com/questions/39732880/…
    • 在他的情况下他不需要使用它,因为他有OnPreferenceClickListener,但在我的情况下我需要它。而关于onRequestPermissionsResult,它只适用于通过requestPermissions()请求的权限,但DND权限不是。
    【解决方案2】:

    我使用startActivityForResult 代替startActivity 如下:

    NotificationManager notificationManager = 
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            assert notificationManager != null;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
                    && !notificationManager.isNotificationPolicyAccessGranted()) {
                //Permission not granted so we will ask for it.
                Intent intent = new Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
                startActivityForResult(intent, 55);
            } else {
                //Permission was granted          
            }
    

    然后我使用isNotificationPolicyAccessGranted()检查了onActivityResult中的结果

    @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            if (requestCode == 55) {
                if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    NotificationManager mNotificationManager = (NotificationManager) getApplication().getSystemService(Context.NOTIFICATION_SERVICE);
                    assert mNotificationManager != null;
                    if (mNotificationManager.isNotificationPolicyAccessGranted()) {
                        //DND permission is granted 
                        //do something 
                    }else{
                        //DND permission isn't granted 
                        //request the permission again or do something else 
                    }
                }
            }
        }
    

    这对我有用,但我不知道是否有更好的方法。

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 1970-01-01
      • 2016-03-16
      • 2011-10-17
      • 2011-08-28
      • 2021-12-21
      • 2019-03-10
      • 2017-05-14
      • 1970-01-01
      相关资源
      最近更新 更多