跳转应用设置页面方便用户修改已拒绝的权限,是经常遇到的需求,但是MIUI 8 系统上测试发现有坑,写一篇文章记录一下。

通常的跳转应用设置页面方法

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
intent.setData(uri);
activity.startActivityForResult(intent, CODE_REQUEST);

就是通过系统封装的隐式意图直接打开设置页面的详情而已,intent 中提供了包名告诉系统需要调取哪个应用的信息。别忘了通过 startActivityForResult 方式打开,毕竟从设置页面返回之后你还要重走一遍权限检查和后续方法是吧。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == CODE_REQUEST) {//TODO something;}
}

Settings 这个类中封装了很多有用的系统属性,看一下 Settings.ACTION_APPLICATION_DETAILS_SETTINGS 这一条的注释:

/*** Activity Action: Show screen of details about a particular application.* <p>* In some cases, a matching Activity may not exist, so ensure you* safeguard against this.* <p>* Input: The Intent's data URI specifies the application package name* to be shown, with the "package" scheme.  That is "package:com.my.app".* <p>* Output: Nothing.*/@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)public static final String ACTION_APPLICATION_DETAILS_SETTINGS ="android.settings.APPLICATION_DETAILS_SETTINGS";

MIUI 8 系统上遇到的问题

场景是这样的,我需要请求的是打开照相机权限,模拟检测到用户禁用该权限后提示去系统设置页面打开权限的情况。

在系统权限设置页授予权限后回调可以检测到权限已获取,但是小米 MIX 的测试机打开照相机后是黑屏,并提示我权限被禁用,需要在安全中心开启。

原来小米系统在安全中心另外做了一套权限管理页面,并且直接无视了 Android 本身的权限设置页面的操作结果。明目张胆的架空啊。但是用户是不管的,所以我们在 MIUI 系统上就只能提示用户去安全中心的权限管理页面进行修改了。

MIUI 上一些特殊适配的问题可以看这篇帖子: http://www.miui.com/thread-2442999-1-1.html

上代码:

public static void settingPermissionActivity(Activity activity) {//判断是否为小米系统if (TextUtils.equals(BrandUtils.getSystemInfo().getOs(), BrandUtils.SYS_MIUI)) {Intent miuiIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");miuiIntent.putExtra("extra_pkgname", activity.getPackageName());//检测是否有能接受该Intent的Activity存在List<ResolveInfo> resolveInfos = activity.getPackageManager().queryIntentActivities(miuiIntent, PackageManager.MATCH_DEFAULT_ONLY);if (resolveInfos.size() > 0) {activity.startActivityForResult(miuiIntent, CODE_REQUEST_CAMERA_PERMISSIONS);return;}}//如果不是小米系统 则打开Android系统的应用设置页Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);Uri uri = Uri.fromParts("package", activity.getPackageName(), null);intent.setData(uri);activity.startActivityForResult(intent, CODE_REQUEST_CAMERA_PERMISSIONS);
}

判断系统的代码如下:


/*** Created by Yomii on 2017/4/12.*/public class BrandUtils {public static final String SYS_EMUI = "sys_emui";public static final String SYS_MIUI = "sys_miui";public static final String SYS_FLYME = "sys_flyme";private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code";private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";private static final String KEY_MIUI_INTERNAL_STORAGE = "ro.miui.internal.storage";private static final String KEY_EMUI_API_LEVEL = "ro.build.hw_emui_api_level";private static final String KEY_EMUI_VERSION = "ro.build.version.emui";private static final String KEY_EMUI_CONFIG_HW_SYS_VERSION = "ro.confg.hw_systemversion";private static SystemInfo systemInfoInstance;public static SystemInfo getSystemInfo() {if (systemInfoInstance == null) {synchronized (BrandUtils.class) {if (systemInfoInstance == null) {systemInfoInstance = new SystemInfo();getSystem(systemInfoInstance);}}}return systemInfoInstance;}private static void getSystem(SystemInfo info) {try {Properties prop = new Properties();prop.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));if (prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null|| prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null|| prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null) {info.os = SYS_MIUI;//小米info.versionCode = Integer.valueOf(prop.getProperty(KEY_MIUI_VERSION_CODE, "0"));info.versionName = prop.getProperty(KEY_MIUI_VERSION_NAME, "V0");} else if (prop.getProperty(KEY_EMUI_API_LEVEL, null) != null|| prop.getProperty(KEY_EMUI_VERSION, null) != null|| prop.getProperty(KEY_EMUI_CONFIG_HW_SYS_VERSION, null) != null) {info.os = SYS_EMUI;//华为info.versionCode = Integer.valueOf(prop.getProperty(KEY_EMUI_API_LEVEL, "0"));info.versionName = prop.getProperty(KEY_EMUI_VERSION, "unknown");} else if (getMeizuFlymeOSFlag().toLowerCase().contains("flyme")) {info.os = SYS_FLYME;//魅族info.versionCode = 0;info.versionName = "unknown";}} catch (IOException e) {e.printStackTrace();}}private static String getMeizuFlymeOSFlag() {return getSystemProperty("ro.build.display.id", "");}private static String getSystemProperty(String key, String defaultValue) {try {Class<?> clz = Class.forName("android.os.SystemProperties");Method get = clz.getMethod("get", String.class, String.class);return (String) get.invoke(clz, key, defaultValue);} catch (Exception e) {}return defaultValue;}public static class SystemInfo {private String os = "android";private String versionName = Build.VERSION.RELEASE;private int versionCode = Build.VERSION.SDK_INT;public String getOs() {return os;}public String getVersionName() {return versionName;}public int getVersionCode() {return versionCode;}@Overridepublic String toString() {return "SystemInfo{" +"os='" + os + '\'' +", versionName='" + versionName + '\'' +", versionCode=" + versionCode +'}';}}
}

Android 跳转应用权限设置页面 适配小米系统相关推荐

  1. Android跳转系统通知权限设置

    测试过华为.小米.魅族跳转下列代码可以支持 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {Intent intent = ...

  2. 【iOS】跳转App权限设置页面

    跳转App设置页的方法 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSetting ...

  3. Android之APP跳转到权限设置界面适配华为、小米、vivo等

    public class PermissionUtil {private final String TAG = "PermissionUtil";private Activity ...

  4. Android 权限被拒绝,跳转至权限设置界面

    参考博客:Android跳转权限设置页面 本文基于上面博客进行封装,直接上代码: import android.content.ComponentName; import android.conten ...

  5. android权限设置在哪找,Android权限申请与打开权限设置页面

    前言 应用的使用需要申请权限,但是如果用户禁用掉,或者禁用并不再提醒就必须到系统设置中开启. // 权限 implementation 'com.yanzhenjie:permission:2.0.3 ...

  6. android 华为开发权限管理,android开发 华为 点击跳转到权限管理页面

    private void goHuaWeiSetting()  { try { //HUAWEI H60-l02 P8max测试通过 Log.d(MainActivity.class.getSimpl ...

  7. vivo手机权限禁止--跳转至对应app的权限设置页面

    vivo手机权限禁止–跳转至对应app的权限设置页面 开始我用的这个方法在vivo 酷派,oopo上:(在vivo上已不能使用) private void doStartApplicationWith ...

  8. 解决OPPO Reno Ace(Android 10)、华为P20、P30进入自启权限设置页面问题,通过AccessibilityService获取栈顶Activity和相应的包名以及类名

    我的问题        在借鉴了网上各路大佬的成果后,发现在Android 10以上大家对自启权限和白名单权限的资料甚少.以至于不能直接通过Copy来解决问题,在华为P20.P30和OPPO Reno ...

  9. Android 打开应用权限设置页面

    1.首先判断自己的应用的通知权限是否开启 private static String CHECK_OP_NO_THROW = "checkOpNoThrow"; private s ...

最新文章

  1. 进程间通信(3) 剪贴板
  2. html5中Canvas、绘制线条模糊、常见绘制工具、绘制基本图形、绘制图片、面向对象的方式绘制图形图片、绘制文本、帧动画绘制
  3. 便携式三星mysql_三星集团某站点MySQL盲注一枚(附python验证脚本)
  4. python函数递归调用时对深度没有限制_在Python程序中设置函数最大递归深度
  5. 网络摄像头的地盘争夺战——四款僵尸软件的技术解析
  6. 使用Tftpd64收集交换机日志
  7. DSP6678 中断程序
  8. android 校验手机号码,检查Android中的有效手机号码
  9. js通过pako压缩数据后java解压数据
  10. Axure元件-内联框架设计网页
  11. 如何查看台式机计算机网络密码,如何在电脑上查找当前的WiFi网络密码
  12. 手机无线连接到电脑共享文件
  13. Navicat导入连接
  14. 在安卓手机中使用微信保存图片提示失败的处理
  15. java查看内存信息
  16. double cbrt(double x)
  17. HYGGE 一元函数积分学
  18. visio使用小知识
  19. SSM框架常用注解总结(持续更新)
  20. 跟着大佬上大分-Web of Lies

热门文章

  1. HTML5期末大作业:医药用品购物网站设计——医药用品购物商城首页(1页) HTML+CSS+JavaScript HTML+CSS大作业_ 医药用品购物网页制作作业_医药用品购物页设计...
  2. CNCF热烈欢迎浪潮升级成为黄金级会员
  3. 在js中获取vue文件的style标签下的内容
  4. JavaScript的按钮点击事件绑定
  5. Visual Studio 2019 Python 环境配置
  6. 好好搭搭机器人编程视频_小学生“玩转”机器人 自学编程制作40多个作品
  7. 战锤斗士海盗船 for Mac(冒险游戏)
  8. 微信小程序引用Echarts绘图显示模糊解决办法
  9. python用逗号隔开输出_关于for循环:Python – 打印出用逗号分隔的列表
  10. 计算机开机时候远程过程调用失败怎么办,win10系统开机弹出对话框“远程过程调用失败且未执行”的技巧介绍...