I have an app that mutes the phone by using AudioManager and setting ringer mode to silent with this code:
AudioManager audioManager =
(AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
try {
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT)
} catch (Exception e) {
e.printStackTrace();
}
This works with Android 6, but now with Android 7, I get the following error:
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)
Are there any new permissions I need to ask for to make this work?
I looked through the Android permissions list, but couldn't find any that seemed relevant.
Based on Android documentation, you have to grant access to Do Not Disturb.
Please check the link
Hope it helps!
I've resolved this issue by opening Setting menu and asking user to grant permission for it if api > 23.
Just call requestMutePermissions() from anywhere and it will work!
ACCESS_NOTIFICATION_POLICY is considered a "normal" permission which means you do NOT have to request permission at runtime. You only have to add the permission to AndroidManifest.xml
Then, to mute all notifications you can set the Interruption filter to INTERRUPTION_FILTER_NONE
INTERRUPTION_FILTER_ALARMS - Alarms only
INTERRUPTION_FILTER_ALL - Normal filter
INTERRUPTION_FILTER_NONE - No interruptions (MUTE)
INTERRUPTION_FILTER_PRIORITY - Priority interruptions
I use
to reset the filter later when onPause() or onStop()
Thanks for your answers, here is a little more detail.
To be able to set ringer mode to silent, you must have permission to access notification policy (like @ucsunil said).
First check if you have this permission. If you do not, open the settings for Do Not Disturb access for your app:
When you run startActivity(), Android opens the Do Not Disturb access settings for your app.
What confused me, was that the way to ask for this permission is completely different from other permissions.
Just for reference, here is the way to ask for permission READ_CONTACTS:
The access you are looking for is:
You need to request the user to provide you with this specific permission.