android 6.0 动态权限申请帮助类

android 6.0 动态权限申请帮助类

我们都知道,在android 6.0 及以上版本中,google为了增强安全性,推出了动态权限申请,即某些权限需要用户在使用时手动的授权,如果不授权则应用无法获得相关权限,那么相关权限申请,具体步骤是什么呢?下边进行简单的步骤梳理:
  1. 通过checkSelfPermission()检测是否已经开启了相关权限,如果已经开启,则不需要权限申请
  2. 如果未开启,则判断是否需要向用户解释为何申请权限shouldShowRequestPermissionRationale
  3. 如果需要(即返回true),则可以弹出对话框提示用户申请权限原因,用户确认后申请权限requestPermissions(),如果不需要(即返回false),则直接申请权限requestPermissions()

下边是将权限申请过程,写成了一个帮助类:

package com.zhangzd.demo.permissiondemo;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by ZHANGZD on 2017/3/22.
 * 用以6.0以上版本动态申请相关权限
 * 单例模式创建帮助类对象
 */

public class PermissionUtils {

    private static  PermissionUtils instance;
    private PermissionUtils(){}   //私有化构造方法
    public static final int requestPermissionCode = 100;


    /**
     * 公共方法,用于获得帮助类的单例对象
     * @return
     */
    public static PermissionUtils getInstance() {
        if (instance == null) {
            instance = new PermissionUtils();
        }
        return instance;
    }

    /**
     * 权限申请
     *
     * @param activity
     * @param permissions
     * new String[]  字符串数组,每一个元素即要申请的权限
     */
    public void requestPermission(Activity activity, String[] permissions) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            //如果sdk版本号小于23 ,则不用动态申请权限,直接返回
            return;
        }
        boolean isRequestPermission = false;
        //循环判断是否存在需要申请的权限,如果存在,将标志置为true
        for (String p : permissions) {
            if (!hasPermission(p, activity)) {
                isRequestPermission = true;
                break;
            }
        }
        if (isRequestPermission) {
            requestPermissionsSafely(permissions, requestPermissionCode, activity);
        }
    }


    /**
     * 判断是否需要申请权限
     * 两种情况下不需要申请
     * 1. 当前版本号小于23
     * 2. 申请的权限已经被授予
     * @param permission   需要申请的权限
     * @param activity
     * @return   返回true 表明需要申请该权限,返回false 表明不需要申请
     */
    @TargetApi(Build.VERSION_CODES.M)
    private boolean hasPermission(String permission, Activity activity) {
        return Build.VERSION.SDK_INT < Build.VERSION_CODES.M || activity.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
    }


    /**
     * 申请相关权限
     */
    @TargetApi(Build.VERSION_CODES.M)
    private void requestPermissionsSafely(String[] permissions, int requestCode, Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            activity.requestPermissions(permissions, requestCode);
        }
    }


    /**
     * 权限申请结果的相应方法
     * @param requestCode
     * @param permissions
     * @param grantResults
     * @param activity
     * @return
     */
    public boolean onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults, Activity activity) {
        if (requestCode == requestPermissionCode) {

            List<String> deniedPermissions = new ArrayList<>();  //用来存放没有申请通过的权限
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                    deniedPermissions.add(permissions[i]);
                }
            }

            if (deniedPermissions.size() > 0) {
                //授权失败
                Toast.makeText(activity,"授权成功!",Toast.LENGTH_SHORT).show();
                return false;
            } else {
                //授权成功
                Toast.makeText(activity,"授权失败!",Toast.LENGTH_SHORT).show();
                return true;
            }
        } else {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                activity.onRequestPermissionsResult(requestCode, permissions, grantResults);
            }
        }
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值