我有一个使用AudioManager静音手机的应用程序,并将铃声模式设置为使用此代码静音:
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUdio_SERVICE); try { audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT) } catch (Exception e) { e.printStackTrace(); }
这适用于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)
是否有任何新的权限,我需要要求这项工作?
我查看了Android权限列表,但找不到任何似乎相关的内容.
解决方法
感谢您的回答,这里有一点点细节.
为了能够将铃声模式设置为静音,您必须具有访问通知策略的权限(如@ucsunil所说).
首先检查你是否有这个权限.如果没有,请打开应用程序的免打扰访问设置:
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && !notificationManager.isNotificationPolicyAccessGranted()) { Intent intent = new Intent( android.provider.Settings .ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS); startActivity(intent); }
当您运行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); }