背景:

众所周知,国内的android是在google之上,各大手机厂商加了一层,诸如MIUI、EUI,之类的系统。因此在我们开发过程中想调出某应用的权限设置页面,调出的是google原生的权限控制界面,但是我们在此页授予应用权限后,实际上应用还是没有权限,只是在google眼里,我已经给你权限了。其实,是被手机厂商系统给拦截了,通俗来讲,中国的手机厂商觉得原生的不好看,或者突出自己系统等原因,会在原生之上加一个壳子,有些东西原生可以决定,有些东西,原生决定了没有用,还是要壳子同意才行。

目的:

因此我们想跳转的是各大手机厂商系统的应用权限设置界面,这就需要知道类名+包名,而且各大手机厂商的类名+包名肯定不一样,也不保证它们会一成不变。

在此https://www.jianshu.com/p/58c6ca8173c4文章的基础上,完善了一个工具类,经过测试:

华为:OK

小米:OK

锤子:OK

一加:OK

vivo:OK,vivo有自己的提示,再次点击后也是会跳出提示,有瑕疵,但是还可以

oppo:OK,自己会提示

魅族:暂时跳转没反应

酷派:无6.0以上的版本笑哭

中兴:OK

联想:OK

PS:

总体来讲,不敢保证肯定能跳过去的,可以采用捕获异常的方式,是在调不到该应用的权限管理页,跳到该应用详情页也可以,反正就是要引导用户在拒绝权限后可以找到在哪授予权限。

当然我这里采用的是startActivityForResult,返回时我想知道权限是否已经授予,如果授予了,那么继续干其他的事情,如果没授予,那么继续提示。

因为使用startActivityForResult若跳的是应用详情页,用户再次点击权限,其实已经跳出该活动了,再返回,再返回到我们的页面,其实并没有效果,因此考虑区分应用详情页和权限详情页

最终确定方案:若打开的是应用详情页,则在onResume中检测权限

核心代码:

    public static void GoToSetting(Activity activity){switch (Build.MANUFACTURER){case MANUFACTURER_HUAWEI://华为Huawei(activity);break;case MANUFACTURER_MEIZU://魅族Meizu(activity);break;case MANUFACTURER_XIAOMI://小米Xiaomi(activity);break;case MANUFACTURER_SONY://索尼Sony(activity);break;case MANUFACTURER_OPPO://oppoOPPO(activity);break;case MANUFACTURER_LG://lgLG(activity);break;case MANUFACTURER_LETV://乐视Letv(activity);break;default://其他try {//防止应用详情页也找不到,捕获异常后跳转到设置,这里跳转最好是两级,太多用户也会觉得麻烦,还不如不跳openAppDetailSetting(activity);
//                    activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT);}catch (Exception e){SystemConfig(activity);}break;}}

总体的思路是:尝试跳应用权限页————>失败------->应用详情页。尽量引导嘛

附送工具类


import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.v7.appcompat.BuildConfig;import static com.lxkh.PermissionsManager.PERMISSION_SETTING_FOR_RESULT;/*** Created by zyy on 2018/3/12.* 直接跳转到权限后返回,可以监控权限授权情况,但是,跳转到应用详情页,无法监测权限情况* 是否要加以区分,若是应用详情页,则跳转回来后,onRestart检测所求权限,如果授权,则收回提示,如果没授权,则继续提示*/public class permissionUtil {/*** Build.MANUFACTURER判断各大手机厂商品牌*/private static final String MANUFACTURER_HUAWEI = "Huawei";//华为private static final String MANUFACTURER_MEIZU = "Meizu";//魅族private static final String MANUFACTURER_XIAOMI = "Xiaomi";//小米private static final String MANUFACTURER_SONY = "Sony";//索尼private static final String MANUFACTURER_OPPO = "OPPO";private static final String MANUFACTURER_LG = "LG";private static final String MANUFACTURER_VIVO = "vivo";private static final String MANUFACTURER_SAMSUNG = "samsung";//三星private static final String MANUFACTURER_LETV = "Letv";//乐视private static final String MANUFACTURER_ZTE = "ZTE";//中兴private static final String MANUFACTURER_YULONG = "YuLong";//酷派private static final String MANUFACTURER_LENOVO = "LENOVO";//联想public static boolean isAppSettingOpen=false;/*** 跳转到相应品牌手机系统权限设置页,如果跳转不成功,则跳转到应用详情页* 这里需要改造成返回true或者false,应用详情页:true,应用权限页:false* @param activity*/public static void GoToSetting(Activity activity){switch (Build.MANUFACTURER){case MANUFACTURER_HUAWEI://华为Huawei(activity);break;case MANUFACTURER_MEIZU://魅族Meizu(activity);break;case MANUFACTURER_XIAOMI://小米Xiaomi(activity);break;case MANUFACTURER_SONY://索尼Sony(activity);break;case MANUFACTURER_OPPO://oppoOPPO(activity);break;case MANUFACTURER_LG://lgLG(activity);break;case MANUFACTURER_LETV://乐视Letv(activity);break;default://其他try {//防止应用详情页也找不到,捕获异常后跳转到设置,这里跳转最好是两级,太多用户也会觉得麻烦,还不如不跳openAppDetailSetting(activity);
//                    activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT);}catch (Exception e){SystemConfig(activity);}break;}}/*** 华为跳转权限设置页* @param activity*/public static void Huawei(Activity activity) {try {Intent intent = new Intent();intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.putExtra("packageName", BuildConfig.APPLICATION_ID);ComponentName comp = new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity");intent.setComponent(comp);activity.startActivityForResult(intent,PERMISSION_SETTING_FOR_RESULT);isAppSettingOpen=false;} catch (Exception e) {openAppDetailSetting(activity);
//            activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT);}}/*** 魅族跳转权限设置页,测试时,点击无反应,具体原因不明* @param activity*/public static void Meizu(Activity activity) {try {Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");intent.addCategory(Intent.CATEGORY_DEFAULT);intent.putExtra("packageName", BuildConfig.APPLICATION_ID);activity.startActivity(intent);isAppSettingOpen=false;}catch (Exception e){openAppDetailSetting(activity);
//            activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT);}}/*** 小米,功能正常* @param activity*/public static void Xiaomi(Activity activity) {try { // MIUI 8 9Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");localIntent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");localIntent.putExtra("extra_pkgname", activity.getPackageName());activity.startActivityForResult(localIntent, PERMISSION_SETTING_FOR_RESULT);isAppSettingOpen=false;
//            activity.startActivity(localIntent);} catch (Exception e) {try { // MIUI 5/6/7Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");localIntent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");localIntent.putExtra("extra_pkgname", activity.getPackageName());activity.startActivityForResult(localIntent, PERMISSION_SETTING_FOR_RESULT);isAppSettingOpen=false;
//                activity.startActivity(localIntent);} catch (Exception e1) { // 否则跳转到应用详情openAppDetailSetting(activity);
//                activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT);//这里有个问题,进入活动后需要再跳一级活动,就检测不到返回结果
//                activity.startActivity(getAppDetailSettingIntent());}}}/*** 索尼,6.0以上的手机非常少,基本没看见* @param activity*/public static void Sony(Activity activity) {try {Intent intent = new Intent();intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.putExtra("packageName", BuildConfig.APPLICATION_ID);ComponentName comp = new ComponentName("com.sonymobile.cta", "com.sonymobile.cta.SomcCTAMainActivity");intent.setComponent(comp);activity.startActivity(intent);isAppSettingOpen=false;}catch (Exception e){openAppDetailSetting(activity);
//            activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT);}}/*** OPPO* @param activity*/public static void OPPO(Activity activity) {try {Intent intent = new Intent();intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.putExtra("packageName", BuildConfig.APPLICATION_ID);ComponentName comp = new ComponentName("com.color.safecenter", "com.color.safecenter.permission.PermissionManagerActivity");intent.setComponent(comp);activity.startActivity(intent);isAppSettingOpen=false;}catch (Exception e){openAppDetailSetting(activity);
//            activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT);}}/*** LG经过测试,正常使用* @param activity*/public static void LG(Activity activity) {try {Intent intent = new Intent("android.intent.action.MAIN");intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.putExtra("packageName", BuildConfig.APPLICATION_ID);ComponentName comp = new ComponentName("com.android.settings", "com.android.settings.Settings$AccessLockSummaryActivity");intent.setComponent(comp);activity.startActivity(intent);isAppSettingOpen=false;}catch (Exception e){openAppDetailSetting(activity);
//            activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT);}}/*** 乐视6.0以上很少,基本都可以忽略了,现在乐视手机不多* @param activity*/public static void Letv(Activity activity) {try {Intent intent = new Intent();intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.putExtra("packageName", BuildConfig.APPLICATION_ID);ComponentName comp = new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.PermissionAndApps");intent.setComponent(comp);activity.startActivity(intent);isAppSettingOpen=false;}catch (Exception e){openAppDetailSetting(activity);
//            activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT);}}/*** 只能打开到自带安全软件* @param activity*/public static void _360(Activity activity) {try {Intent intent = new Intent("android.intent.action.MAIN");intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.putExtra("packageName", BuildConfig.APPLICATION_ID);ComponentName comp = new ComponentName("com.qihoo360.mobilesafe", "com.qihoo360.mobilesafe.ui.index.AppEnterActivity");intent.setComponent(comp);activity.startActivity(intent);}catch (Exception e){openAppDetailSetting(activity);
//            activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT);}}/*** 系统设置界面* @param activity*/public static void SystemConfig(Activity activity) {Intent intent = new Intent(Settings.ACTION_SETTINGS);activity.startActivity(intent);}/*** 获取应用详情页面* @return*/private static Intent getAppDetailSettingIntent(Activity activity) {Intent localIntent = new Intent();localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);if (Build.VERSION.SDK_INT >= 9) {localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");localIntent.setData(Uri.fromParts("package", activity.getPackageName(), null));} else if (Build.VERSION.SDK_INT <= 8) {localIntent.setAction(Intent.ACTION_VIEW);localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");localIntent.putExtra("com.android.settings.ApplicationPkgName", activity.getPackageName());}return localIntent;}public static void openAppDetailSetting(Activity activity){activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT);isAppSettingOpen=true;}
}

暂时想到的处理判断授权结果的思路就是,应用权限页--->startActivityForResult    应用详情页--->resume中检测

有更好的思路欢迎留言讨论交流

后续若需要完善其他机型,可使用adb命令  adb shell dumpsys activity | grep -i run查看设置页,自行添加即可

ps(20200723)

各位同学有遇到设备型号大小写不匹配的情况,统一转大小写匹配即可,str.toLowerCase(或者大写),请同学们自行修改代码

Android调app权限设置界面(适配各大手机厂商终极版本)相关推荐

  1. android 权限管理适配 oppo,Android调app权限设置界面(适配各大手机厂商终极版本)...

    背景: 众所周知,国内的android是在google之上,各大手机厂商加了一层,诸如MIUI.EUI,之类的系统.因此在我们开发过程中想调出某应用的权限设置页面,调出的是google原生的权限控制界 ...

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

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

  3. Android 跳转权限设置界面的终极方案

    转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10338377.html 有时候APP需要获取某些权限,要让用户手动打开,那么问题来了,若是直接提醒用户出 ...

  4. android app没有读写权限设置,Android 6.0以上权限拒绝打开权限设置界面的解决方法...

    本人使用小米手机,打开qq或者微信的时候,某个权限拒绝的话,会提示你开启,点击开启会跳转到app的权限设置界面,当然了,这是国内系统深层定制的原因,也就是说这个界面原声的android没有的!这里以小 ...

  5. Android 跳转应用权限设置页面 适配小米系统

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

  6. App跳转到权限设置界面

    iOS 10 App跳转到权限设置界面(iOS10之前就不各个记录了) NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLSt ...

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

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

  8. Android运行时权限,设置帮助类BaseActivity;电话权限,短信权限,

                                      Android运行时权限设置帮助类BaseActivity  一.电话权限 package com.glandroid.smssen ...

  9. android 修改应用权限设置在哪里,Android在应用设置里关闭权限,返回生命周期处理...

    问题 在处理6.0运行时权限时,很多人都忽略了这样一个问题: 在一个App应用里,如果已经允许了一个权限比如(读取通讯权限),此刻去调用相机,弹出权限申请对话框,此刻点击拒绝,然后经过处理后弹出去设置 ...

最新文章

  1. Excel的合并解析
  2. word文档中添加mathtype加载项
  3. python psycopg2_Ubuntu 安装 PostgreSQL 和 python-psycopg2基础教程(以及错误解决)
  4. 51单片机开发板(W25Q16学习)
  5. js学习总结----弹性势能动画之抛物线运动
  6. 11部高分学科纪录片,助力孩子涨姿势拓视野~
  7. 微信上传素材 java_微信素材上传(JAVA)
  8. [vue-element] 有用过哪些vue的ui?说说它们的优缺点?
  9. mysql建立从库同时备份_mysql主从库配置读写分离以及备份
  10. 【软件工程】极限编程
  11. 计算机启动单元,快速启动计算机系统的方法和计算机的启动系统与流程
  12. RHEL 7.5 部署 OpenStack Queens 踩坑记
  13. Useful “ifconfig” Commands to Configure Network Interface in Linux
  14. Swift 新建 APP 黑屏问题
  15. Ubuntu配置及美化篇
  16. 154. 正则表达式匹配
  17. 服务器审计资质证书,利用ACS服务器实现用户的认证、授权和审计
  18. TIA博途中FC功能块的介绍与管脚定义
  19. error: C++ preprocessor “/lib/cpp“ fails sanity check错误解决方法
  20. i78700k配什么显卡好_i7 8700配什么显卡好 最新适合搭配i7-8700的显卡推荐

热门文章

  1. C++:排队叫号系统(附完整源码)
  2. 杰理之SDK 开发方式【篇】
  3. 实战Java高并发程序设计(第二版)-chp5并行模式与算法
  4. Linux:使用ulimit设置文件最大打开数
  5. Ubuntu 在设置共享文件夹时/mnt下没有hgfs文件夹(vmware-tools)
  6. 对拷的硬盘无法修改计算机名,如何实现硬盘对拷?两台电脑硬盘对拷资料详细图解(非GHOST式)(2)...
  7. oracle 连续累加,Oracle 累加和实现
  8. 金昌EX9000文件批量转换
  9. Linux 杀毒软件发现的漏洞可使得黑客获得 root 权限
  10. 计算机网络——IP数据报的发送和转发过程