安卓开发运行时权限(RunTimePermission)动态权限申请的工具类(支持扩展)

android6.0以上(API>=23),或者说Build.VERSION.SDK_INT >=Build.VERSION_CODES.M,敏感权限类似相机,位置,手机通讯录,打电话等权限都需要动态申请,先附上流程图,仅供参考,可以根据此流程进行自定义的二次封装扩展:
这里写图片描述

动态申请权限的流程图:

动态权限的工具类

package com.refly.pigcommissioner.permissionutil;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;

/**
 *
 * @author ytf
 * @date 2018/4/25
 */

public class PermissionUtils {
    private Activity context;
    public static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 200;

    private static PermissionUtils instance = null;

    private PermissionUtils(Activity context) {
        this.context = context;
    }

    /**
     * 单例对象实例
     */
    public static PermissionUtils getInstance(Activity context) {
        if (instance == null) {
            instance = new PermissionUtils(context);
        }
        return instance;
    }

    /**
     * 是否需要动态申请权限
     *
     * @param requestCode
     */
    public boolean needPermission(int requestCode) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return false;
        }else {
            return  true;
        }
//        requestAllPermissions(requestCode);
    }

    /**
     * 常用全部敏感权限
     * @param requestCode
     */
    public void requestAllPermissions(int requestCode) {
        ActivityCompat.requestPermissions(context,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA, Manifest.permission.READ_PHONE_STATE, Manifest.permission.ACCESS_FINE_LOCATION},
                MY_PERMISSIONS_REQUEST_CALL_PHONE);
    }
    /**
     * 打电话 的权限
     * @param requestCode
     */
    public boolean requesCallPhonePermissions(int requestCode) {
        if (ContextCompat.checkSelfPermission(context,
                Manifest.permission.CALL_PHONE)
                != PackageManager.PERMISSION_GRANTED) {//没有权限
            ActivityCompat.requestPermissions(context,
                    new String[]{Manifest.permission.CALL_PHONE},
                    MY_PERMISSIONS_REQUEST_CALL_PHONE);
            return false;
        } else {
            return true;
        }
    }
    /**
     * 读取内存卡的权限
     * @param requestCode
     */
    public boolean requestReadSDCardPermissions(int requestCode) {
        if (ContextCompat.checkSelfPermission(context,
                Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {//没有权限
            ActivityCompat.requestPermissions(context,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_CALL_PHONE);
            return false;
        } else {
            return true;
        }
    }
    /**
     * 获取相机权限
     * @param requestCode
     */
    public boolean requestCamerPermissions(int requestCode) {
        if (ContextCompat.checkSelfPermission(context,
                Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {//没有权限
            ActivityCompat.requestPermissions(context,
                    new String[]{Manifest.permission.CAMERA},
                    MY_PERMISSIONS_REQUEST_CALL_PHONE);
            return false;
        } else {
            return true;
        }
    }
    /**
     * 获取手机联系人的权限
     * @param requestCode
     */
    public boolean requestReadConstantPermissions(int requestCode) {
        if (ContextCompat.checkSelfPermission(context,
                Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {//没有权限
            ActivityCompat.requestPermissions(context,
                    new String[]{Manifest.permission.READ_CONTACTS},
                    MY_PERMISSIONS_REQUEST_CALL_PHONE);
            return false;
        } else {
            return true;
        }
    }
    /**
     * 获取用户权限
     * @param requestCode
     */
    public boolean requestGET_ACCOUNTSPermissions(int requestCode) {
        if (ContextCompat.checkSelfPermission(context,
                Manifest.permission.GET_ACCOUNTS)
                != PackageManager.PERMISSION_GRANTED) {//没有权限
            ActivityCompat.requestPermissions(context,
                    new String[]{Manifest.permission.GET_ACCOUNTS},
                    MY_PERMISSIONS_REQUEST_CALL_PHONE);
            return false;
        } else {
            return true;
        }
    }
    /**
     * 获取定位权限
     * @param requestCode
     */
    public boolean requestLocationPermissions(int requestCode) {
        if (ContextCompat.checkSelfPermission(context,
                Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {//没有权限
            ActivityCompat.requestPermissions(context,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST_CALL_PHONE);
            return false;
        } else {
            return true;
        }
    }

}

工具类使用的核心代码:

   private com.refly.pigcommissioner.permissionutil.PermissionUtils instance = null;

    @AfterViews
    void afterViews() {
   。。。
        //判断是否为android6.0系统版本,如果是,需要动态添加权限
      instance=com.refly.pigcommissioner.permissionutil.PermissionUtils.getInstance(this);
        if (instance.needPermission(com.refly.pigcommissioner.permissionutil.PermissionUtils.MY_PERMISSIONS_REQUEST_CALL_PHONE)){
//           返回true表示需要动态申请权限
            instance.requestLocationPermissions(200);
        }else {
//            返回false不需要动态申请,直接操作
        }
。。。。

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            // requestCode即所声明的权限获取码,在checkSelfPermission时传入
            case BAIDU_READ_PHONE_STATE:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 获取到权限,作相应处理(调用定位SDK应当确保相关权限均被授权,否则可能引起定位失败)
                    locationService = ((MainApp) getApplication()).locationService;
                    locationService.registerListener(myListener);
                    locationService.start();
                } else {
                    // 没有获取到权限,做特殊处理
                    Toast.makeText(getApplicationContext(), "获取位置权限失败,请手动开启", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                Logger.e("获取位置权限失败,请手动开启");
                break;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值