在Android 7(API级别24)中,我的应用程序不允许静音手机(将铃声模式设置为静音)

Bja*_*sen 38 android android-audiomanager android-7.0-nougat

我有一个应用程序,通过使用AudioManager将手机静音,并使用此代码将铃声模式设置为静音:

AudioManager audioManager = 
    (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
try {
    audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT)
} catch (Exception e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

这适用于Android 6,但现在使用Android 7,我收到以下错误:

System.err: java.lang.SecurityException: Not allowed to change Do Not Disturb state
System.err: at android.os.Parcel.readException(Parcel.java:1683)
System.err: at android.os.Parcel.readException(Parcel.java:1636)
System.err: at android.media.IAudioService$Stub$Proxy.setRingerModeExternal(IAudioService.java:962)
System.err: at android.media.AudioManager.setRingerMode(AudioManager.java:1022)
System.err: at controllers.SearchResultController.mutePhone(SearchResultController.java:185)
Run Code Online (Sandbox Code Playgroud)

有什么新的权限我需要要求才能使这项工作?

我查看了Android权限列表,但找不到任何相似的内容.

Bja*_*sen 57

感谢您的回答,这里有更多细节.

为了能够将铃声模式设置为静音,您必须获得访问通知政策的许可(如@ucsunil所说).

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

然后,检查您是否拥有此权限.如果没有,请打开应用程序的"请勿打扰访问"设置:

NotificationManager notificationManager = 
    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
    && !notificationManager.isNotificationPolicyAccessGranted()) {

    Intent intent = new Intent(
                        android.provider.Settings
                        .ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);

    startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)

运行startActivity()时,Android会为您的应用打开"请勿打扰"访问设置.

令我感到困惑的是,请求此权限的方式与其他权限完全不同.

仅供参考,以下是请求权限READ_CONTACTS的方法:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
    && ActivityCompat.checkSelfPermission(activity,
        Manifest.permission.READ_CONTACTS)
        == PackageManager.PERMISSION_DENIED) {

    ActivityCompat.requestPermissions(activity,
        new String[]{ Manifest.permission.READ_CONTACTS },
            REQUEST_CODE_READ_CONTACTS);
}
Run Code Online (Sandbox Code Playgroud)

  • 请勿打扰访问来自SDK 23 Marshmallow.所以`> = Build.VERSION_CODES.M` BTW对于`<uses-permission android:name ="android.permission.ACCESS_NOTIFICATION_POLICY"/>是必要的. (5认同)
  • 令人惊讶的是简单的事情往往会让Android变得复杂.这是解决方案.. (4认同)

ucs*_*nil 9

您正在寻找的访问权限是:

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

您需要请求用户向您提供此特定权限.


Win*_*own 5

ACCESS_NOTIFICATION_POLICY被认为是“普通”权限,这意味着您不必在运行时请求权限。您只需要向AndroidManifest.xml添加权限

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

然后,要使所有通知静音,您可以将“中断”过滤器设置为INTERRUPTION_FILTER_NONE

NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            previous_notification_interrupt_setting = notificationManager.getCurrentInterruptionFilter();
            notificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_NONE);
        }
Run Code Online (Sandbox Code Playgroud)

INTERRUPTION_FILTER_ALARMS-仅报警
INTERRUPTION_FILTER_ALL-普通过滤器
INTERRUPTION_FILTER_NONE-无中断(MUTE)
INTERRUPTION_FILTER_PRIORITY-优先中断

我用

 int previous_notification_interrupt_setting = notificationManager.getCurrentInterruptionFilter();
Run Code Online (Sandbox Code Playgroud)

稍后在onPause()或onStop()时重置过滤器