Android代码库 添加Android6.0动态权限获取的BaseActivity

说明

Android6.0新特性中增加了对危险权限的动态获取。如果SDK>=23的安卓系统在对危险权限操作时没有进行权限动态获取,系统将停止运行。
对任意一项危险权限的动态获取都包含权限的检查、权限获取及权限返回响应三部分,如果不进行封装,会导致代码冗余严重,不方便使用。
所以可以通过对Activity进行封装,增加对权限的动态获取即可。

危险权限

Android代码库 添加Android6.0动态权限获取的BaseActivity

封装类代码

import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;

import com.example.h.sdustcamp.Constans;

/**
 * Created by Chook_lxk on 18/12/27
 * @function Activity基类 添加6.0权限的动态获取
 */
public class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    /**
     * 权限判断方法
     * @param permissions
     * @return
     */
    public boolean hasPermission(String... permissions) {
        for(String permission : permissions) {
            if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

    /**
     * 权限请求方法
     * @param code
     * @param permissions
     */
    public void requestPermission(int code, String... permissions) {
        ActivityCompat.requestPermissions(this, permissions, code);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case Constans.CALENDAR_CODE:
                doCalendarPermission();
                break;
            case Constans.CALL_PHONE_CODE:
                doCallPhonePermission();
                break;
            case Constans.CAMERA_CODE:
                doCameraPermission();
                break;
            case Constans.LOCATION_CODE:
                doLocationPermission();
                break;
            case Constans.MICROPHONE_CODE:
                doMicrophonePermission();
                break;
            case Constans.READ_EXTERNAL_CODE:
                doReadExternalPermission();
                break;
            case Constans.SMS_CODE:
                doSmsPermission();
                break;
            case Constans.WRITE_EXTERNAL_CODE:
                doWriteExternalPermission();
                break;
        }
    }

    /**
     * 默认的日历权限处理
     */
    public void doCalendarPermission(){}

    /**
     * 默认的打电话权限处理
     */
    public void doCallPhonePermission(){}

    /**
     * 默认的相册权限处理
     */
    public void doCameraPermission(){}

    /**
     * 默认的位置获取权限处理
     */
    public void doLocationPermission(){}

    /**
     * 默认的麦克风权限处理
     */
    public void doMicrophonePermission(){}

    /**
     * 默认的读SD权限处理
     */
    public void doReadExternalPermission(){}

    /**
     * 默认的写SD权限处理
     */
    public void doWriteExternalPermission(){}

    /**
     * 默认的短信权限处理
     */
    public void doSmsPermission(){}
}

package com.example.h.sdustcamp;

/**
 * Created by Chook_lxk on 18/12/27
 *
 * @function 工程的全局变量
 */
public class Constans {

    /**
     * 权限常量相关
     */
    public static final int WRITE_EXTERNAL_CODE = 0x01;
    public static final int READ_EXTERNAL_CODE = 0x02;
    public static final int CALL_PHONE_CODE = 0x03;
    public static final int CALENDAR_CODE = 0x04;
    public static final int CAMERA_CODE = 0x05;
    public static final int LOCATION_CODE = 0x06;
    public static final int MICROPHONE_CODE = 0x07;
    public static final int SMS_CODE = 0x08;
}

使用方法

在清单中添加对应权限,然后需要获取权限的Activity类继承自BaseActivity,使用对应方法,然后复写对应do方法即可。