文档章节

Android 6.0之后,在运行时请求权限,工具类

Reone的开发笔记
 Reone的开发笔记
发布于 2017/02/05 23:29
字数 881
阅读 78
收藏 1

 关于运行时请求权限,很多重复的工作.so

这个工具类用于6.0之后 在运行时请求权限

关于主动权限需要注意的是:

1.所有需要的权限,不管是否有主动请求操作,都需要在manifest中做配置

2.权限有正常权限与危险权限:

        在manifest中列出了正常权限,系统将自动授予该权限;

        在manifest中列出了危险权限,则用户必须明确批准您的应用使用这些权限。

 

import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.util.Log;

import java.util.Arrays;

/**
 * Created by wangxingsheng on 2017/2/5.
 *
 * 这个工具类用于6.0之后 在运行时请求权限
 * 关于主动权限需要注意的是
 * 1.所有需要的权限,不管是否有主动请求操作,都需要在manifest中做配置
 * 2.权限有正常权限与危险权限:
 *      在manifest中列出了正常权限,系统将自动授予该权限;
 *      在manifest中列出了危险权限,则用户必须明确批准您的应用使用这些权限。
 *
 *
 * 更多见官方法介绍:https://developer.android.google.cn/training/permissions/requesting.html
 *
 */

public class PermissionUtil {
    private static void log(String debug){
        Log.d("PermissionUtil",debug);
    }

    /**
     * 主动请求权限,按官方推荐逻辑,此方法应该在每次需要权限时都要调用
     * 检查权限->询问请求历史 ? 解释权限 (点击确认再次请求) : 直接请求权限
     * @param thisActivity
     * @param permission
     * @param requestCode
     * @param dialogMessage
     */
    public static void requestPermissionWithCheck(Activity thisActivity, String permission, int requestCode, String dialogMessage){

        if(Build.VERSION.SDK_INT < 23){
            log("your sdk < 23,the method 'requestPermissionWithCheck(..' do nothing");
            return;
        }
        try {
            //检查权限是否已经开启
            if (ContextCompat.checkSelfPermission(thisActivity,permission)
                    != PackageManager.PERMISSION_GRANTED) {
                log("the permission has not,continue...");
                //如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
                //此时应该向用户解释为什么需要这个权限
                if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                        permission)) {
                    //弹出解释弹窗
                    showExplanation(thisActivity,requestCode,dialogMessage,permission);
                } else {
                    //发起权限请求
                    requestPermissions(thisActivity,new String[]{permission},requestCode);
                }
            }else{
                log("the permission has ready");
            }
        }catch (Exception e){
            log("the method 'requestPermissionWithCheck(..' apper error,so jump setting");
            //请求权限的过程中出现问题直接跳到设置界面,让用户手动设置权限
            openPermissionSetting(thisActivity);
        }

    }

    /**
     * 直接请求权限
     */
    public static void requestPermissions(Activity thisActivity,String[] permissions,int requestCode){
        log("request Permission " + Arrays.asList(permissions));
        ActivityCompat.requestPermissions(thisActivity,
                permissions,
                requestCode);
    }

    /**
     * 开启本应用权限设置界面
     * @param context
     */
    public static void openPermissionSetting(Context context){
        log("start jump Setting...");
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", context.getPackageName(), null);
        intent.setData(uri);
        context.startActivity(intent);
        log("jump Setting end");
    }

    /**
     * 弹出解释权限的弹框,点击确定请求权限
     * @param thisActivity
     * @param requestCode
     * @param dialogMessage
     * @param requestPermission
     */
    public static void showExplanation(final Activity thisActivity,final int requestCode,
                                            String dialogMessage, final String requestPermission) {
        log("here show showExplanation");
        String defaultMessage = "Need " + requestPermission + " authority, otherwise next function can not be used";
        showMessageOKCancel(thisActivity,
                dialogMessage == null ? defaultMessage : defaultMessage
                , new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                requestPermissions(thisActivity,new String[]{requestPermission},requestCode);
            }
        });
    }

    /**
     * 在onRequestPermissionsResult中判断某个requestCode陪同的权限请求结果是否成功
     *
     * @param grantResults
     * @return
     */
    public static boolean checkRequestCode(@NonNull int[] grantResults){
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //权限请求成功
            return true;
        } else {
            //权限请求被拒绝
            return false;
        }
    }

    /*此方法是在onRequestPermissionsResult中回调的例子
    public final static void requestPermissionsResult(final Activity activity,
                                                final int requestCode,
                                                @NonNull String[] permissions,
                                                @NonNull int[] grantResults) {
        if (activity == null) {
            return;
        }
        switch (requestCode) {
            case -1:
                if (PermissionUtil.checkRequestCode(grantResults)) {
                    //权限请求成功

                } else {
                    //权限请求被拒绝
                }
                break;
            default:
        }
    }
    */

        /**
         * 一个普通弹窗
         * @param context
         * @param message
         * @param okListener
         */
    private static void showMessageOKCancel(final Activity context, String message, DialogInterface.OnClickListener okListener) {
        new AlertDialog.Builder(context)
                .setMessage(message)
                .setPositiveButton("OK", okListener)
                .setNegativeButton("Cancel", null)
                .create()
                .show();

    }

}

 

© 著作权归作者所有

Reone的开发笔记
粉丝 6
博文 70
码字总数 29350
作品 0
松江
程序员
私信 提问
Android权限禁止及友好提示用户开通必要权限

Android权限 Android安全架构规定:默认情况下,任何应用都没有权限执行对其他应用、操作系统或用户有不利影响的任何操作。这包括读写用户的私有数据(联系人,短信,相册,位置)、读写其他...

丁先森
04/08
0
0
Android targetSdkVersion 版本适配指北(持续更新)

Google Play 要求新应用(自 2019 年 8 月 1 日起)和应用更新(自 2019 年 11 月 1 日起)将目标 API 级别至少设为 28(至少为 Android 9.0)。在这两个日期之前,新应用和应用更新的目标 ...

JohnnyShieh
05/29
0
0
PermissionsDispatcher,Android 6.0 运行时权限

运行时权限 从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。 系统权限分为两类: 正常权限:只需在你应用的 Androidmanifest.xml 中列出,...

SuShine
01/08
274
0
安卓应用安全指南 5.2.1 权限和保护级别 示例代码

5.2.1 权限和保护级别 示例代码 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 5.2.1.1 如何使用 Android OS 的系统权限 Android 操作...

apachecn_飞龙
2018/04/01
0
0
Android 在运行时请求权限

从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要授予权限。它还让用户可以...

嘿嘿嘿IT
04/01
13
0

没有更多内容

加载失败,请刷新页面

加载更多

正则 01-07

https://github.com/jjjfan/shell_devops/blob/master/%E6%AD%A3%E5%88%99/%E6%AD%A3%E5%88%99.md...

zhfan
23分钟前
8
0
数据在云上安全吗?DDoS攻击怎么办?

云计算是大势所趋,根据2016年IDC的统计分析报告指出: 2015-2020年间IT总市场复合增长率仅为3% 全球公有云市场复合增长率为19% 74%的中国企业认为云值得信任 62%的企业认为云在基础防御、平...

嘉为科技
24分钟前
5
0
json菜单树过滤器

递归实现json菜单树过滤,过滤到匹配节点并保留其父节点 //递归过滤节点 function nodeFilter(menuList, fiterName) { var reg = new RegExp(fiterName); ...

iyonghua
28分钟前
5
0
Java 之 volatile 超级详解

一、概念 volatile 是 Java 中的关键字,是一个变量修饰符,被用来修饰会被不同线程访问和修改的变量。 二、volatile 作用 1. 可见性 可见性是指多个线程访问同一个变量时,其中一个线程修改...

java后端开发
34分钟前
3
0
用命令生成keystore

生成android签名文件最靠谱的方式 推荐命令生成 进入到 \sdk\platform-tools 文件夹下 输入命令 D:\soft\sdk\platform-tools>keytool -genkeypair -alias cerificatekey -keyalg RSA -valid......

MrLins
36分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部