Kar*_*ner 4 android android-permissions
我是初学Android开发人员,手头有一个有趣的问题.我试图用手机静音
AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误
java.lang.SecurityException: Not allowed to change Do Not Disturb state
Run Code Online (Sandbox Code Playgroud)
现在我不明白这一点,因为我正在使用EasyPermissions(https://github.com/googlesamples/easypermissions)并请求许可
Manifest.permission.ACCESS_NOTIFICATION_POLICY
Run Code Online (Sandbox Code Playgroud)
但它并没有要求我在应用启动时允许任何内容.我认为这是因为ACCESS_NOTIFICATION_POLICY是一个非危险的权限,因此在安装时被授予,我也将其添加到我的manifest.xml中,因此
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
Run Code Online (Sandbox Code Playgroud)
但它仍然无法正常工作,我的应用程序崩溃,因为它抛出"不允许更改为请勿打扰状态"错误.很奇怪我发现我可以使用以下代码请求进入"请勿打扰访问"屏幕
Intent intent = new Intent(
android.provider.Settings
.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?为什么我不能将此权限作为正常权限申请?我是否真的必须通过允许我的应用程序静音手机的意图?
我将通过startActivityForResult回调发布一个答案,说明我是如何设法解决23岁以上和23岁以下的机器人的问题
requestMutePhonePermsAndMutePhone()函数在主要操作onCreate函数中调用.
请注意,代码非常具有侵入性,因为"设置"菜单是永久性的,直到您接受"请勿打扰"权限,但可以轻松地根据个人需求容纳此代码,并可能构建问题提示等...
private void requestMutePhonePermsAndMutePhone() {
try {
if (Build.VERSION.SDK_INT < 23) {
AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
} else if( Build.VERSION.SDK_INT >= 23 ) {
this.requestDoNotDisturbPermissionOrSetDoNotDisturbApi23AndUp();
}
} catch ( SecurityException e ) {
}
}
private void requestDoNotDisturbPermissionOrSetDoNotDisturbApi23AndUp() {
//TO SUPPRESS API ERROR MESSAGES IN THIS FUNCTION, since Ive no time to figrure our Android SDK suppress stuff
if( Build.VERSION.SDK_INT < 23 ) {
return;
}
NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
if ( notificationManager.isNotificationPolicyAccessGranted()) {
AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
} else{
// Ask the user to grant access
Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
startActivityForResult( intent, MainActivity.ON_DO_NOT_DISTURB_CALLBACK_CODE );
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Check which request we're responding to
if (requestCode == MainActivity.ON_DO_NOT_DISTURB_CALLBACK_CODE ) {
this.requestDoNotDisturbPermissionOrSetDoNotDisturbApi23AndUp();
}
}
Run Code Online (Sandbox Code Playgroud)
从AudioManager#setRingerMode()引用:
从N开始,除非应用程序已被授予"请勿打扰访问权限",否则不允许切换"请勿打扰"的振铃模式调整.
从API级别23开始,您必须ACCESS_NOTIFICATION_POLICY在清单中声明权限,然后用户需要授予您的应用访问权限以切换"请勿打扰".您可以使用NotificationManager#isNotificationPolicyAccessGranted()检查是否授予了访问权限.如果您的软件包无权访问,请启动一个ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGSintent,以便用户可以访问您的应用程序.
NotificationManager n = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
if(n.isNotificationPolicyAccessGranted()) {
AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
}else{
// Ask the user to grant access
Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
startActivityForResult(intent);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12911 次 |
| 最近记录: |