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)
您正在寻找的访问权限是:
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
Run Code Online (Sandbox Code Playgroud)
您需要请求用户向您提供此特定权限.
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()时重置过滤器
| 归档时间: |
|
| 查看次数: |
23359 次 |
| 最近记录: |