安卓Android6.0权限动态获取操作示例

本文实例讲述了安卓Android6.0权限动态获取操作。分享给大家供大家参考,具体如下:

众所周知 , 安卓6.0现在运用的越来越广泛 , 因为相对于之前的几个版本 , 对于用户权限这个概念确实不是很重视 , 而6.0 之后 , 为了提升用户的操作安全性 ,  运行时权限诞生了, 就是在用户运行软件的时候动态获取所需要的权限 , 下面跟大家分享一个我的代码案例 :

import android.Manifest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import java.util.ArrayList;
import java.util.List;
/**
 * 继承了Activity,实现Android6.0的运行时权限检测
 * 需要进行运行时权限检测的Activity可以继承这个类
 *
 * @author xingtao sun
 * @创建时间:2016年12月28日
 * @项目名称: 安卓6.0运行时权限
 */
public class CheckPermissionsActivity extends AppCompatActivity
    implements
    ActivityCompat.OnRequestPermissionsResultCallback {
  /**
   * 需要进行检测的权限数组 这里只列举了几项 小伙伴可以根据自己的项目需求 来添加
   */
  protected String[] needPermissions = {
      Manifest.permission.ACCESS_COARSE_LOCATION,//定位权限
      Manifest.permission.ACCESS_FINE_LOCATION,//定位权限
      Manifest.permission.WRITE_EXTERNAL_STORAGE,//存储卡写入权限
      Manifest.permission.READ_EXTERNAL_STORAGE,//存储卡读取权限
      Manifest.permission.READ_PHONE_STATE//读取手机状态权限
  };
  private static final int PERMISSON_REQUESTCODE = 0;
  /**
   * 判断是否需要检测,防止不停的弹框
   */
  private boolean isNeedCheck = true;
  @Override
  protected void onResume() {
    super.onResume();
    if (isNeedCheck) {
      checkPermissions(needPermissions);
    }
  }
  /**
   * 检查权限
   */
  private void checkPermissions(String... permissions) {
    List<String> needRequestPermissonList = findDeniedPermissions(permissions);
    if (null != needRequestPermissonList
        && needRequestPermissonList.size() > 0) {
      ActivityCompat.requestPermissions(this,
          needRequestPermissonList.toArray(
              new String[needRequestPermissonList.size()]),
          PERMISSON_REQUESTCODE);
    }
  }
  /**
   * 获取权限集中需要申请权限的列表
   *
   * @param permissions
   * @return
   * @since 2.5.0
   */
  private List<String> findDeniedPermissions(String[] permissions) {
    List<String> needRequestPermissonList = new ArrayList<String>();
    for (String perm : permissions) {
      if (ContextCompat.checkSelfPermission(this,
          perm) != PackageManager.PERMISSION_GRANTED
          || ActivityCompat.shouldShowRequestPermissionRationale(
          this, perm)) {
        needRequestPermissonList.add(perm);
      }
    }
    return needRequestPermissonList;
  }
  /**
   * 检测是否有的权限都已经授权
   *
   * @param grantResults
   */
  private boolean verifyPermissions(int[] grantResults) {
    for (int result : grantResults) {
      if (result != PackageManager.PERMISSION_GRANTED) {
        return false;
      }
    }
    return true;
  }
  @Override
  public void onRequestPermissionsResult(int requestCode,
                      String[] permissions, int[] paramArrayOfInt) {
    if (requestCode == PERMISSON_REQUESTCODE) {
      if (!verifyPermissions(paramArrayOfInt)) {
        showMissingPermissionDialog();
        isNeedCheck = false;
      }
    }
  }
  /**
   * 弹出对话框, 提示用户手动授权
   *
   */
  private void showMissingPermissionDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(R.string.notifyTitle);
    builder.setMessage(R.string.notifyMsg);
    // 拒绝授权 退出应用
    builder.setNegativeButton(R.string.cancel,
        new DialogInterface.OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) {
            finish();
          }
        });
  //同意授权
  builder.setPositiveButton(R.string.setting,
      new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
          startAppSettings();
        }
      });
  builder.setCancelable(false);
  builder.show();
}
/**
 * 启动应用的设置
 *
 */
private void startAppSettings() {
  Intent intent = new Intent(
      Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  intent.setData(Uri.parse("package:" + getPackageName()));
  startActivity(intent);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
  if (keyCode == KeyEvent.KEYCODE_BACK) {
    this.finish();
    return true;
  }
  return super.onKeyDown(keyCode, event);
}

string资源

<resources>
  <string name="app_name">My Library</string>
  <string name="notifyTitle">提示</string>
  <string name="notifyMsg">当前应用缺少必要权限。\n\n请点击\"设置\"-\"权限\"-打开所需权限。</string>
  <string name="setting">设置</string>
  <string name="cancel">取消</string>
</resources>

送上效果图

注:更多关于Android权限控制的说明可点击此处查看Android权限操作说明

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android文件操作技巧汇总》、《Android资源操作技巧汇总》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

您可能感兴趣的文章:

  • Android6.0动态申请权限所遇到的问题小结
  • 谈谈Android6.0运行时的权限处理
  • Android6.0仿微信权限设置
  • 详解Android6.0运行时权限管理
  • 一款不错的android6.0、7.0权限管理器推荐
  • android6.0权限动态申请框架permissiondispatcher的方法
  • Android 操作系统获取Root权限 原理详细解析
  • Android获取ROOT权限的实例代码
  • Android权限操作之uses-permission详解
  • Android权限控制之自定义权限
  • Android需要提升权限的操作方法
(0)

相关推荐

  • Android 操作系统获取Root权限 原理详细解析

    android root权限破解分析 许多机友新购来的Android机器没有破解过Root权限,无法使用一些需要高权限的软件,以及进行一些高权限的操作,其实破解手机Root权限是比较简单及安全的,破解Root权限的原理就是在手机的/system/bin/或/system/xbin/目录下放置一个可执行文件"su",这是一个二进制文件,相当于电脑上的exe文件,仅仅在系统中置入这个"su"文件是不会给手机的软件或硬件造成任何故障. 下面的代码是android系统原版的

  • 详解Android6.0运行时权限管理

    自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装的事情,也不会再不征求用户授权的情况下,就可以任意的访问用户隐私,而且即使在授权之后也可以及时的更改权限.这就是6.0版本做出的更拥护和注重用户的一大体现. 一.认知 今天我们就来学习下Android6.0的权限管理. Android6.0系统把权限分为两个级别: 一个是Normal Permiss

  • Android6.0仿微信权限设置

    Android 6.0版本对于程序员兄弟来说最不友好的就是权限的问题,动态权限的设置曾经让我很苦恼,目前大部分关于6.0权限设置的框架基本都是一次性访问多个权限(EasyPermissions),这样导致的问题就是如果我们申请了三种权限,而用户只同意了其中一种,下次再申请权限又是一次性申请三种,很不方便对于用户来说很不友好,偶然情况下发现了安卓猴的这篇文章, http://sunjiajia.com/2016/04/19/android-m-permissions/ 在此基础上做了修改,就实现了

  • Android获取ROOT权限的实例代码

    获取Android的ROOT权限其实很简单,只要在Runtime下执行命令"su"就可以了. 复制代码 代码如下: // 获取ROOT权限public void get_root(){ if (is_root()){        Toast.makeText(mCtx, "已经具有ROOT权限!", Toast.LENGTH_LONG).show();    }    else{        try{            progress_dialog = P

  • Android权限操作之uses-permission详解

    本文实例讲述了Android权限操作之uses-permission.分享给大家供大家参考,具体如下: 我们在安装Android软件的时候,系统会提示该软件所需要的权限,相对于其他系统,android的权限非常多.我们在开发软件的时候,也需要声明相应的权限,比如希望软件能发短信,需要声明软件调用短信的权限,否则软件运行的时候就会报错. Android的权限在AndroidManifest.xml文件里配置.AndroidManifest文件中有四个标签与permission有关,它们分别是 <p

  • Android6.0动态申请权限所遇到的问题小结

    白天在做SDK23版本的适配,遇到了不少坑,现在抽空记下来,以此为戒. 首先要知道哪些坑,就得先了解一些定义和基本使用方式. 那么先介绍一下动态申请的权限分组情况. 下面的权限组是由谷歌官方定义的,目的是在申请权限时,只要用户允许同一权限组的任意一条权限,那么该组的其他权限也就默认是允许的.不过据高人介绍,在使用时最好是用到哪个权限就具体的请求该权限,因为保不齐哪天谷歌一高兴就把权限组换了甚至删了 group:android.permission-group.CONTACTS permissio

  • 谈谈Android6.0运行时的权限处理

    运行时权限介绍 Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上, 又新增了运行时权限动态检测,以下权限都需要在运行时判断: 1.身体传感器 2.日历    3.摄像头 4.通讯录 5.地理位置 6.麦克风 7.电话 8.短信 9.存储空间 在 Android 6.0 中,app 如果想要获得某些权限,会在应用中弹出一个对话框,让用户确认是否授予该权限. 具体的截图如下: 这要做的好处就是运行一个 app 时可以拒绝其中的某些权限,防止 app 触及到你的

  • android6.0权限动态申请框架permissiondispatcher的方法

    1,添加依赖 在project的build.gradle文件中添加 dependencies { classpath 'com.android.tools.build:gradle:2.1.2' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' } 在module的build.gradle中添加 apply plugin: 'android-apt' ....... dependencies { .... compile 'co

  • Android权限控制之自定义权限

    天哪,这篇文章终于说道如何自定义权限了,左盼右盼,其实这个自定义权限相当easy.为了方便叙述,我这边会用到两个app作为例子示范. Permission App: used to define a new permission 这个作为定义权限的App,我称之为Permission App. Client App: used to access the specified activity of Permission App 这个作为访问上述自定义权限的App,我称之为Client App 先

  • 一款不错的android6.0、7.0权限管理器推荐

    一款不错的android6.0.7.0权限管理器PermissionsCheckerUtil 初始化权限管理器:构造方法 private final Context mContext; public PermissionsCheckerUtil(Context mContext) { this.mContext = mContext; } 判断使用的权限集合是否已经全部允许 // 判断权限集合 public boolean lacksPermissions(String... permissio

  • Android需要提升权限的操作方法

    权限提升方法:一种方法:1.在AndroidManifest.xml中的manifest节点中添加 android:sharedUserId="android.uid.system".2.添加后程序在虚拟机上是不可以直接用的.但可以用eclipse编译成apk.3.(这一步经验证不执行即可)编译成apk后用压缩工具打开apk,把META-INF目录中的CERT.SF.CERT.RSA 两个文件删除.4.使用android自带的签名工具signapk.jar 以及源码中的platform

随机推荐