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

我有一个应用程序,通过使用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权限列表,但找不到任何相关的内容。

Solutions Collecting From Web of "在Android 7(API级别24)我的应用程序是不允许静音手机(设置铃声模式沉默)"

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

为了能够将振铃模式设置为无声,您必须具有访问通知政策的权限(如@ucsunil所述)。

首先检查你是否有这个权限。 如果不这样做,请打开应用程序的“请勿打扰”访问设置:

 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); } 

当您运行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); } 

您正在寻找的访问是:

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

您需要请求用户为您提供此特定权限。

ACCESS_NOTIFICATION_POLICY被视为“正常”权限,这意味着您不必在运行时请求权限。 您只需将权限添加到AndroidManifest.xml

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

然后,要将所有通知closures,您可以将Interruptionfilter设置为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); } 

INTERRUPTION_FILTER_ALARMS – 仅限警报
INTERRUPTION_FILTER_ALL – 普通filter
INTERRUPTION_FILTER_NONE – 无中断(MUTE)
INTERRUPTION_FILTER_PRIORITY – 优先中断

我用

  int previous_notification_interrupt_setting = notificationManager.getCurrentInterruptionFilter(); 

稍后在onPause()或onStop()时重置筛选器

基于Android文档,您必须授予访问“请勿打扰”的权限。

从N开始,除非应用程序已被授予请勿打扰访问权限,否则不允许触发免打扰的振铃模式调整。 请参阅isNotificationPolicyAccessGranted()。

请检查链接

希望能帮助到你!

@Bjarte发生这种情况是因为自API Level 23以来,您在运行时拥有权限。 一旦这个NotifyPolicy被添加到api level 23,那就是为什么你必须以不同的方式来实现。

ps:对不起,我不能添加这个评论:/

问候