Android 6.0以上权限拒绝打开权限设置界面的解决方法

本人使用小米手机,打开qq或者微信的时候,某个权限拒绝的话,会提示你开启,点击开启会跳转到app的权限设置界面,当然了,这是国内系统深层定制的原因,也就是说这个界面原声的android没有的!这里以小米和魅族作为示例讲解如何让用户手动打开权限,当然了如果是原声的android就让他跳转到应用的详情设置页面(有点坑,因为普通用户还是不知道怎么整)。

参考了很多零零碎碎的东西,网址已经找不到了。。。。。。

ok,第一步是跳转到系统的界面,下面基本上可以从9开始考虑了,可以简化。

String SCHEME = "package";
  //调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.1及之前版本)
  final String APP_PKG_NAME_21 = "com.android.settings.ApplicationPkgName";
  //调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.2)
  final String APP_PKG_NAME_22 = "pkg";
  //InstalledAppDetails所在包名
  final String APP_DETAILS_PACKAGE_NAME = "com.android.settings";
  //InstalledAppDetails类名
  final String APP_DETAILS_CLASS_NAME = "com.android.settings.InstalledAppDetails";

  Intent intent = new Intent();
  final int apiLevel = Build.VERSION.SDK_INT;
  if (apiLevel >= 9) { // 2.3(ApiLevel 9)以上,使用SDK提供的接口
   intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
   Uri uri = Uri.fromParts(SCHEME, getPackageName(), null);
   intent.setData(uri);
  } else { // 2.3以下,使用非公开的接口(查看InstalledAppDetails源码)
   // 2.2和2.1中,InstalledAppDetails使用的APP_PKG_NAME不同。
   final String appPkgName = (apiLevel == 8 ? APP_PKG_NAME_22
     : APP_PKG_NAME_21);
   intent.setAction(Intent.ACTION_VIEW);
   intent.setClassName(APP_DETAILS_PACKAGE_NAME,
     APP_DETAILS_CLASS_NAME);
   intent.putExtra(appPkgName, getPackageName());
  }
  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);

第二个,miui,首先你得判断是miui,亲自测试,MIUI7稳定版,MIUI8开发板本可行,工具类下面会提供下载

if (CheckPhoneSystemUtils.isMIUI()) {
   MLog.i("产品/硬件的制造商小米:");
   intent.setAction("miui.intent.action.APP_PERM_EDITOR");
   intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
   intent.putExtra("extra_pkgname", getPackageName());
   intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   try {
    startActivity(intent);
   } catch (Exception e) {
    e.printStackTrace();
    Toast.makeText(MediaRecoderService.this, "只有MIUI才可以设置哦", Toast.LENGTH_SHORT).show();
   }
  }

第三个,flyme(由于没有flyme机子),采用的云手机测试的

else if (CheckPhoneSystemUtils.isFlyme()) {
   intent.setAction("com.meizu.safe.security.SHOW_APPSEC");
   intent.addCategory(Intent.CATEGORY_DEFAULT);
   intent.putExtra("packageName", getPackageName());
   intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   try {
    startActivity(intent);
   } catch (Exception e) {
    e.printStackTrace();
    Toast.makeText(MediaRecoderService.this, "只有Flyme才可以设置哦", Toast.LENGTH_SHORT).show();
   }
  }

下面是工具类:BuildProperties

public class BuildProperties {
 private final Properties properties;

 private BuildProperties() throws IOException {
  properties = new Properties();
  properties.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));
 }

 public boolean containsKey(final Object key) {
  return properties.containsKey(key);
 }

 public boolean containsValue(final Object value) {
  return properties.containsValue(value);
 }

 public Set<Map.Entry<Object, Object>> entrySet() {
  return properties.entrySet();
 }

 public String getProperty(final String name) {
  return properties.getProperty(name);
 }

 public String getProperty(final String name, final String defaultValue) {
  return properties.getProperty(name, defaultValue);
 }

 public boolean isEmpty() {
  return properties.isEmpty();
 }

 public Enumeration<Object> keys() {
  return properties.keys();
 }

 public Set<Object> keySet() {
  return properties.keySet();
 }

 public int size() {
  return properties.size();
 }

 public Collection<Object> values() {
  return properties.values();
 }

 public static BuildProperties newInstance() throws IOException {
  return new BuildProperties();
 }

CheckPhoneSystemUtils

 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";

 /**
  * 检测MIUI
  *
  * @return
  */
 public static boolean isMIUI() {
  try {
   final BuildProperties prop = BuildProperties.newInstance();
   return prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null || prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null || prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null;
  } catch (final IOException e) {
   return false;
  }
 }

 /**
  * 检测Flyme
  *
  * @return
  */
 public static boolean isFlyme() {
  try { // Invoke Build.hasSmartBar()
   final Method method = Build.class.getMethod("hasSmartBar");
   return method != null;
  } catch (final Exception e) {
   return false;
  }
 }

以上这篇Android 6.0以上权限拒绝打开权限设置界面的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Android判断是否有拍照权限的实例代码

    下面一段代码给大家介绍android判断是否有拍照权限,具体代码如下所示: /** * 返回true 表示可以使用 返回false表示不可以使用 */ public boolean cameraIsCanUse() { boolean isCanUse = true; Camera mCamera = null; try { mCamera = Camera.open(); Camera.Parameters mParameters = mCamera.getParameters(); //针对

  • Android 手动获取判断处理权限

    主要用到的几个方法: //检查权限 int checkSelfPermission(String) //申请权限 void requestPermissions(int, String...) //是否应该显示请求权限的说明 boolean shouldShowRequestPermissionRationale(String) //处理权限结果回调 void onRequestPermissionsResult(int,String[],int[]) 是否有权限常量标识: PackageMan

  • Android判断用户是否允许了摄像头权限实例代码

    如题,既然是判断用户是否允许了摄像头权限,那么,咱们就忽略是Manifest配置的问题,因为这是开发者的事. 用户在使用APP时,如果首次进入用摄像头的地方,手机会提示是否允许该应用使用摄像头.有些用户小手一抖.或者压根就不想开启摄像头,咔擦,就给你关了,那好了.下回再进入该功能,就会出现APP一片黑,或者崩溃的情况. 作为开发者,正常思路是要提示用户,摄像头权限被你关了,赶紧去手动开启,不然,就别想用该功能了!那,咱们该怎么实现这个思路呢? 一.判断摄像头权限 Android API没提供判断

  • Android判断某个权限是否开启的方法

    如下所示: /** * 读写权限 自己可以添加需要判断的权限 */ public static String[]permissionsREAD={ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; /** * 判断权限集合 * permissions 权限数组 * return true-表示没有改权限 false-表示权限已开启 */ public static bo

  • Android判断后台服务是否开启的两种方法实例详解

    Android判断后台服务是否开启的两种方法实例详解 最近项目用到后台上传,就开启了一个服务service. 但是刚开始用这种方法,有些机型不支持:酷派不支持.然后又换了第二种判断方法. // public boolean isServiceWork(Context mContext, String serviceName) { // boolean isWork = false; // ActivityManager myAM = (ActivityManager) mContext // .

  • Android 6.0以上权限拒绝打开权限设置界面的解决方法

    本人使用小米手机,打开qq或者微信的时候,某个权限拒绝的话,会提示你开启,点击开启会跳转到app的权限设置界面,当然了,这是国内系统深层定制的原因,也就是说这个界面原声的android没有的!这里以小米和魅族作为示例讲解如何让用户手动打开权限,当然了如果是原声的android就让他跳转到应用的详情设置页面(有点坑,因为普通用户还是不知道怎么整). 参考了很多零零碎碎的东西,网址已经找不到了...... ok,第一步是跳转到系统的界面,下面基本上可以从9开始考虑了,可以简化. String SCH

  • Android 8.0升级不跳转应用安装页面的解决方法

    最近开发遇到了个问题,app升级的时候,其他手机都能正常升级,下载完安装包,跳到安装页面进行新版本的安装.但却有用户反映,华为P10和华为Mate 9升级时,怎么也无法跳转到安装页面.起初我以为是华为手机自身系统的问题(因为手上的华为测试机都是正常的),还特地对比了几种配置的华为手机,最后发现,是Android 8.0系统版本的锅,不是手机的问题. 2017年8月22日,Google发布了Android 8.0的正式版,其正式名称为:Android Oreo(奥利奥),Android 8.0强化

  • android 6.0 写入SD卡的权限申请实例讲解

    6.0的手机对于写入手机需要申请权限的 我做了如下处理 下面我贴出代码 package com.example.admin.sdapplication; import android.Manifest; import android.app.Dialog; import android.content.DialogInterface; import android.content.pm.PackageManager; import android.os.Build; import android

  • android 6.0下webview的定位权限设置方法

    如下所示: WebView webView = (WebView)findViewById(R.id.webview); WebSettings webSettings = webView.getSettings(); //webview支持js脚本 webSettings.setJavaScriptEnabled(true); //启用数据库 webSettings.setDatabaseEnabled(true); //设置定位的数据库路径 String dir = this.getAppl

  • win2003服务器asp.net权限设置问题及解决方法

    服务器asp.net权限设置问题及解决方法 本人服务器使用环境:WIN 2003 ASP.NET相对于ASP,设置权限方面有点不同,有一点儿设置错了都运行不到.在网上搜索到的都是很垃圾的答案,没有一个用得到的,下面是我自己设置并从中遇到的问题摸索后得到的经验,给大家分享. ASP.NET需要用到USERS组的权限,因为我也遇过很多次自己设置了权限之后发现网站运行不了,很郁闷.下面根据出现的问题,一点点解决,让你的ASP.NET运行起来.. 问题一: 未找到路径"C:\"的一部分. 说明

  • Android 8.0 读取内部和外部存储以及外置SDcard的方法

    最近碰到询问我这个读取SDcard的问题, 很久没有看这部分了,所以大致看了一下, 顺便记录一下.在Android 8.0上做了测试. 一般的Android App能读取的存储空间主要有三种: app自己的私有目录,也就是/data/data/<app 目录>. 读写这个目录不需要单独的权限.每个app只能读写自己的目录,而不能读写其他app的目录. Android通过Seandroid对权限进行了管理. /sdcard. 这个其实是Android手机的internal storage. 也就

  • Android 6.0上sdcard和U盘路径获取和区分方法

    Android6.0上会根据卡的种类和卡的挂载状态来动态生成挂载路径,所以之前写固定路径的办法不可用,最后通过网上查找和分析android源码,通过反射获取到路径,并且进行了正确区分,代码如下: /** * 6.0获取外置sdcard和U盘路径,并区分 * @param mContext * @param keyword SD = "内部存储"; EXT = "SD卡"; USB = "U盘" * @return */ public static

  • Android开发框架之自定义ZXing二维码扫描界面并解决取景框拉伸问题

    先给大家展示下效果图: 扫描内容是下面这张,二维码是用zxing库生成的 由于改了好几个类,还是去年的事都忘得差不多了,所以只能上这个类的代码了,主要就是改了这个CaptureActivity.java package com.zxing.activity; import java.io.IOException; import java.util.Vector; import android.app.Activity; import android.content.Intent; import

  • Android编程使WebView支持HTML5 Video全屏播放的解决方法

    本文实例讲述了Android编程使WebView支持HTML5 Video全屏播放的解决方法.分享给大家供大家参考,具体如下: 1)需要在AndroidManifest.xml文件中声明需要使用HardwareAccelerate, 可以细化到Activity级别,如果不需要的View可以声明不要用加速,但是需要在代码中做,具体如下: a. 如果要声明整个应用都要加速: 复制代码 代码如下: <application ... android:hardwareAccelerated ="tr

  • 配置android开发环境时出现eclipse获取不到ADT的解决方法

    本文实例讲述了配置android开发环境时出现eclipse获取不到ADT的解决方法.分享给大家供大家参考,具体如下: 在安装完Android SDK后eclipse要获取ADT, 可是由于GFW的存在, eclipse经常无法从http://dl-ssl.google.com/android/eclipse 获取到任何东西. 下面提供解决方法: 以往安装ADT根本就不是个问题,可是现在就是个大问题了,联通的宽带网络连www.google.com.hk都打不开,你叫我们这些P民怎么活? 无论ht

随机推荐