Android请求ACCESS_NOTIFICATION_POLICY并静音电话

Kar*_*ner 4 android android-permissions

我是初学Android开发人员,手头有一个有趣的问题.我试图用手机静音

AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误

java.lang.SecurityException: Not allowed to change Do Not Disturb state
Run Code Online (Sandbox Code Playgroud)

现在我不明白这一点,因为我正在使用EasyPermissions(https://github.com/googlesamples/easypermissions)并请求许可

Manifest.permission.ACCESS_NOTIFICATION_POLICY
Run Code Online (Sandbox Code Playgroud)

但它并没有要求我在应用启动时允许任何内容.我认为这是因为ACCESS_NOTIFICATION_POLICY是一个非危险的权限,因此在安装时被授予,我也将其添加到我的manifest.xml中,因此

<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
Run Code Online (Sandbox Code Playgroud)

但它仍然无法正常工作,我的应用程序崩溃,因为它抛出"不允许更改为请勿打扰状态"错误.很奇怪我发现我可以使用以下代码请求进入"请勿打扰访问"屏幕

Intent intent = new Intent(
                    android.provider.Settings
                            .ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
 startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?为什么我不能将此权限作为正常权限申请?我是否真的必须通过允许我的应用程序静音手机的意图?

Kar*_*ner 9

我将通过startActivityForResult回调发布一个答案,说明我是如何设法解决23岁以上和23岁以下的机器人的问题

requestMutePhonePermsAndMutePhone()函数在主要操作onCreate函数中调用.

请注意,代码非常具有侵入性,因为"设置"菜单是永久性的,直到您接受"请勿打扰"权限,但可以轻松地根据个人需求容纳此代码,并可能构建问题提示等...

private void requestMutePhonePermsAndMutePhone() {
    try {
        if (Build.VERSION.SDK_INT < 23) {
            AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
            audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
        } else if( Build.VERSION.SDK_INT >= 23 ) {
            this.requestDoNotDisturbPermissionOrSetDoNotDisturbApi23AndUp();
        }
    } catch ( SecurityException e ) {

    }
}

private void requestDoNotDisturbPermissionOrSetDoNotDisturbApi23AndUp() {
    //TO SUPPRESS API ERROR MESSAGES IN THIS FUNCTION, since Ive no time to figrure our Android SDK suppress stuff
    if( Build.VERSION.SDK_INT < 23 ) {
        return;
    }

    NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
    if ( notificationManager.isNotificationPolicyAccessGranted()) {
        AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
        audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
    } else{
        // Ask the user to grant access
        Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
        startActivityForResult( intent, MainActivity.ON_DO_NOT_DISTURB_CALLBACK_CODE );
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == MainActivity.ON_DO_NOT_DISTURB_CALLBACK_CODE ) {
        this.requestDoNotDisturbPermissionOrSetDoNotDisturbApi23AndUp();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 什么是 MainActivity.ON_DO_NOT_DISTURB_CALLBACK_CODE ? (3认同)

rck*_*krd 8

AudioManager#setRingerMode()引用:

从N开始,除非应用程序已被授予"请勿打扰访问权限",否则不允许切换"请勿打扰"的振铃模式调整.

从API级别23开始,您必须ACCESS_NOTIFICATION_POLICY在清单中声明权限,然后用户需要授予您的应用访问权限以切换"请勿打扰".您可以使用NotificationManager#isNotificationPolicyAccessGranted()检查是否授予了访问权限.如果您的软件包无权访问,请启动一个ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGSintent,以便用户可以访问您的应用程序.

NotificationManager n = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
if(n.isNotificationPolicyAccessGranted()) {
  AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
  audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
}else{
  // Ask the user to grant access
  Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
  startActivityForResult(intent);
}
Run Code Online (Sandbox Code Playgroud)

  • 1. 不能用常规的“允许”、“拒绝”提示询问 ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS 策略吗?2. 当用户从设置菜单返回时,您建议我如何设置回调?否则,这就是问题的正确答案! (2认同)