Android - 運行時權限一個工具類搞定

轉載請註明出處:https://blog.csdn.net/mythmayor/article/details/101451937

一、運行時權限簡述。

請點擊這裏瞭解更多

二、運行時權限工具類。

package com.mythmayor.demo.utils;

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

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

/**
 * Created by mythmayor on 2018/9/18.
 * <p>
 * 可參考文章:https://blog.csdn.net/mythmayor/article/details/81388482
 * <p>
 * 自從安卓6.0系統開始,Android中引入了運行時權限,需要在代碼中動態申請,下面是需要動態申請的所有運行時權限:
 * 這裏有兩點需要注意:
 * 1.運行時權限在安卓6.0系統及以上版本中只在AndroidManifest.xml配置中是不行的,還需要在代碼中動態申請。
 * 2.每個運行時權限都屬於一個權限組,我們在申請某一權限並通過用戶的授權後,該權限所在的權限組中其它的權限也會被授權。
 * <p>
 * 運行時權限(危險權限)一共是9組24個權限:
 * <p>
 * 權限組名              權限名
 * ----------------------------------------------
 * CALENDAR             READ_CALENDAR / WRITE_CALENDAR
 * ----------------------------------------------
 * CAMERA               CAMERA
 * ----------------------------------------------
 * CONTACTS             READ_CONTACTS / WRITE_CONTACTS / GET_ACCOUNTS
 * ----------------------------------------------
 * LOCATION             ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION
 * ----------------------------------------------
 * MICROPHONE           RECORD_AUDIO
 * ----------------------------------------------
 * PHONE                READ_PHONE_STATE / CALL_PHONE / READ_CALL_LOG / WRITE_CALL_LOG / ADD_VOICEMAIL / USE_SIP / PROCESS_OUTGOING_CALLS
 * -----------------------------------------------
 * SENSORS              BODY_SENSORS
 * -----------------------------------------------
 * SMS                  SEND_SMS / RECEIVE_SMS / READ_SMS / RECEIVE_WAP_PUSH / RECEIVE_MMS
 * -----------------------------------------------
 * STORAGE              READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE
 * -----------------------------------------------
 * <p>
 * 該工具類提供:1.申請所有權限;2.申請單個權限;3.申請自定義權限組。以3爲例:
 * String[] permissionArray = new String[]{PermissionManager.PERMISSION_CAMERA,PermissionManager.PERMISSION_MICROPHONE,PermissionManager.PERMISSION_PHONE,PermissionManager.PERMISSION_STORAGE};
 * PermissionManager.getInstance(this).getCustomPermission(permissionArray);
 */
/*
    在Activity中可通過onRequestPermissionsResult來獲取申請權限的結果,示例代碼:

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        //注意:此處返回的grantResults數組與上述申請自定義權限組傳入的permissionArray數組是對應的。
        switch (requestCode) {
            case PermissionManager.REQUEST_CODE_CUSTOM:
                if (grantResults.length > 0) {
                    for (int i = 0; i < grantResults.length; i++) {
                        int grantResult = grantResults[i];
                        boolean success = grantResult == PackageManager.PERMISSION_GRANTED;
                        if (success) {
                            //單項權限申請成功
                        } else {
                            //單項權限申請失敗
                        }
                    }
                }
                break;
            default:

                break;
    }
}*/

public class PermissionManager {

    private static Context mContext;
    /**
     * 權限
     */
    public static final String PERMISSION_CALENDAR = Manifest.permission.READ_CALENDAR;//日曆權限
    public static final String PERMISSION_CAMERA = Manifest.permission.CAMERA;//攝像頭權限
    public static final String PERMISSION_CONTACTS = Manifest.permission.READ_CONTACTS;//聯繫人權限
    public static final String PERMISSION_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;//定位權限
    public static final String PERMISSION_MICROPHONE = Manifest.permission.RECORD_AUDIO;//麥克風權限
    public static final String PERMISSION_PHONE = Manifest.permission.READ_PHONE_STATE;//手機狀態權限
    public static final String PERMISSION_SENSORS = Manifest.permission.BODY_SENSORS;//傳感器權限
    public static final String PERMISSION_SMS = Manifest.permission.SEND_SMS;//短信權限
    public static final String PERMISSION_STORAGE = Manifest.permission.READ_EXTERNAL_STORAGE;//存儲權限
    /**
     * 請求碼
     */
    public static final int REQUEST_CODE_ALL = 0;
    public static final int REQUEST_CODE_CALENDAR = 1;
    public static final int REQUEST_CODE_CAMERA = 2;
    public static final int REQUEST_CODE_CONTACTS = 3;
    public static final int REQUEST_CODE_LOCATION = 4;
    public static final int REQUEST_CODE_MICROPHONE = 5;
    public static final int REQUEST_CODE_PHONE = 6;
    public static final int REQUEST_CODE_SENSORS = 7;
    public static final int REQUEST_CODE_SMS = 8;
    public static final int REQUEST_CODE_STORAGE = 9;
    public static final int REQUEST_CODE_CUSTOM = 10;
    /**
     * 權限標記,true爲已獲取該權限,false爲未獲取該權限
     */
    private boolean isAllPermissionOk = false;
    private boolean isCalendarPermissionOk = false;
    private boolean isCameraPermissionOk = false;
    private boolean isContactsPermissionOk = false;
    private boolean isLocationPermissionOk = false;
    private boolean isMicrophonePermissionOk = false;
    private boolean isPhonePermissionOk = false;
    private boolean isSensorsPermissionOk = false;
    private boolean isSmsPermissionOk = false;
    private boolean isStoragePermissionOk = false;
    private boolean isCustomPermissionOk = false;
    //當前未獲取的權限列表
    private List<String> mPermissionList = new ArrayList<>();
    //自定義權限數組
    private String[] mCustomPermissionArray;
    //所有權限數組
    private String[] mAllPermissionArray = new String[]{
            PERMISSION_CALENDAR,
            PERMISSION_CAMERA,
            PERMISSION_CONTACTS,
            PERMISSION_LOCATION,
            PERMISSION_MICROPHONE,
            PERMISSION_PHONE,
            PERMISSION_SENSORS,
            PERMISSION_SMS,
            PERMISSION_STORAGE
    };

    private static class SingletonHolder {
        public static PermissionManager instance = new PermissionManager();
    }

    private PermissionManager() {
    }

    public static PermissionManager getInstance(Context context) {
        mContext = context;
        return SingletonHolder.instance;
    }

    /**
     * 檢查所有權限
     *
     * @return true已獲取所有權限,false未獲取所有權限
     */
    public boolean checkAllPermission() {
        isAllPermissionOk = true;
        mPermissionList.clear();
        for (int i = 0; i < mAllPermissionArray.length; i++) {
            if (ContextCompat.checkSelfPermission(mContext, mAllPermissionArray[i]) != PackageManager.PERMISSION_GRANTED) {
                mPermissionList.add(mAllPermissionArray[i]);
                isAllPermissionOk = false;
            }
        }
        return isAllPermissionOk;
    }

    /**
     * 獲取所有權限
     */
    public void getAllPermission() {
        checkAllPermission();
        if (mPermissionList.isEmpty()) {
            //未授予的權限爲空,表示都授予了
        } else {
            //請求權限方法
            String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//將List轉爲數組
            ActivityCompat.requestPermissions((Activity) mContext, permissions, REQUEST_CODE_ALL);
        }
    }

    /**
     * 檢查自定義權限
     *
     * @param customPermissionArray 自定義權限數組
     * @return true已獲取自定義權限,false未獲取自定義權限
     */
    public boolean checkCustomPermission(String[] customPermissionArray) {
        mCustomPermissionArray = customPermissionArray;
        if (mCustomPermissionArray == null || mCustomPermissionArray.length == 0) {
            return false;
        }
        isCustomPermissionOk = true;
        mPermissionList.clear();
        for (int i = 0; i < mCustomPermissionArray.length; i++) {
            if (ContextCompat.checkSelfPermission(mContext, mCustomPermissionArray[i]) != PackageManager.PERMISSION_GRANTED) {
                mPermissionList.add(mCustomPermissionArray[i]);
                isCustomPermissionOk = false;
            }
        }
        return isCustomPermissionOk;
    }

    /**
     * 獲取自定義權限
     *
     * @param customPermissionArray 自定義權限數組
     */
    public void getCustomPermission(String[] customPermissionArray) {
        checkCustomPermission(customPermissionArray);
        if (mPermissionList.isEmpty()) {
            //未授予的權限爲空,表示都授予了
        } else {
            //請求權限方法
            String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//將List轉爲數組
            ActivityCompat.requestPermissions((Activity) mContext, permissions, REQUEST_CODE_CUSTOM);
        }
    }

    /**
     * 檢查日曆權限
     *
     * @return true已獲取日曆權限,false未獲取日曆權限
     */
    public boolean checkCalendarPermission() {
        int permission = ActivityCompat.checkSelfPermission(mContext, PERMISSION_CALENDAR);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            isCalendarPermissionOk = false;
        } else {
            isCalendarPermissionOk = true;
        }
        return isCalendarPermissionOk;
    }

    /**
     * 獲取日曆權限
     */
    public void getCalendarPermission() {
        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, PERMISSION_CALENDAR)) {
            // Show an expanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.
        } else {
            // No explanation needed, we can request the permission.
            ActivityCompat.requestPermissions((Activity) mContext, new String[]{PERMISSION_CALENDAR}, REQUEST_CODE_CALENDAR);
            // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            // app-defined int constant. The callback method gets the
            // result of the request.
        }
    }

    /**
     * 檢查攝像頭權限
     *
     * @return true已獲取攝像頭權限,false未獲取攝像頭權限
     */
    public boolean checkCameraPermission() {
        int permission = ActivityCompat.checkSelfPermission(mContext, PERMISSION_CAMERA);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            isCameraPermissionOk = false;
        } else {
            isCameraPermissionOk = true;
        }
        return isCameraPermissionOk;
    }

    /**
     * 獲取攝像頭權限
     */
    public void getCameraPermission() {
        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, PERMISSION_CAMERA)) {
        } else {
            ActivityCompat.requestPermissions((Activity) mContext, new String[]{PERMISSION_CAMERA}, REQUEST_CODE_CAMERA);
        }
    }

    /**
     * 檢查聯繫人權限
     *
     * @return true已獲取聯繫人權限,false未獲取聯繫人權限
     */
    public boolean checkContactsPermission() {
        int permission = ActivityCompat.checkSelfPermission(mContext, PERMISSION_CONTACTS);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            isContactsPermissionOk = false;
        } else {
            isContactsPermissionOk = true;
        }
        return isContactsPermissionOk;
    }

    /**
     * 獲取聯繫人權限
     */
    public void getContactsPermission() {
        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, PERMISSION_CONTACTS)) {
        } else {
            ActivityCompat.requestPermissions((Activity) mContext, new String[]{PERMISSION_CONTACTS}, REQUEST_CODE_CONTACTS);
        }
    }

    /**
     * 檢查定位權限
     *
     * @return true已獲取定位權限,false未獲取定位權限
     */
    public boolean checkLocationPermission() {
        int permission = ActivityCompat.checkSelfPermission(mContext, PERMISSION_LOCATION);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            isLocationPermissionOk = false;
        } else {
            isLocationPermissionOk = true;
        }
        return isLocationPermissionOk;
    }

    /**
     * 獲取定位權限
     */
    public void getLocationPermission() {
        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, PERMISSION_LOCATION)) {
        } else {
            ActivityCompat.requestPermissions((Activity) mContext, new String[]{PERMISSION_LOCATION}, REQUEST_CODE_LOCATION);
        }
    }

    /**
     * 檢查麥克風權限
     *
     * @return true已獲取麥克風權限,false未獲取麥克風權限
     */
    public boolean checkMicrophonePermission() {
        int permission = ActivityCompat.checkSelfPermission(mContext, PERMISSION_MICROPHONE);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            isMicrophonePermissionOk = false;
        } else {
            isMicrophonePermissionOk = true;
        }
        return isMicrophonePermissionOk;
    }

    /**
     * 獲取麥克風權限
     */
    public void getMicrophonePermission() {
        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, PERMISSION_MICROPHONE)) {
        } else {
            ActivityCompat.requestPermissions((Activity) mContext, new String[]{PERMISSION_MICROPHONE}, REQUEST_CODE_MICROPHONE);
        }
    }

    /**
     * 檢查手機狀態權限
     *
     * @return true已獲取手機狀態權限,false未獲取手機狀態權限
     */
    public boolean checkPhonePermission() {
        int permission = ActivityCompat.checkSelfPermission(mContext, PERMISSION_PHONE);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            isPhonePermissionOk = false;
        } else {
            isPhonePermissionOk = true;
        }
        return isPhonePermissionOk;
    }

    /**
     * 獲取手機狀態權限
     */
    public void getPhonePermission() {
        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, PERMISSION_PHONE)) {
        } else {
            ActivityCompat.requestPermissions((Activity) mContext, new String[]{PERMISSION_PHONE}, REQUEST_CODE_PHONE);
        }
    }

    /**
     * 檢查傳感器權限
     *
     * @return true已獲取傳感器權限,false未獲取傳感器權限
     */
    public boolean checkSensorsPermission() {
        int permission = ActivityCompat.checkSelfPermission(mContext, PERMISSION_SENSORS);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            isSensorsPermissionOk = false;
        } else {
            isSensorsPermissionOk = true;
        }
        return isSensorsPermissionOk;
    }

    /**
     * 獲取傳感器權限
     */
    public void getSensorsPermission() {
        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, PERMISSION_SENSORS)) {
        } else {
            ActivityCompat.requestPermissions((Activity) mContext, new String[]{PERMISSION_SENSORS}, REQUEST_CODE_SENSORS);
        }
    }

    /**
     * 檢查短信權限
     *
     * @return true已獲取短信權限,false未獲取短信權限
     */
    public boolean checkSmsPermission() {
        int permission = ActivityCompat.checkSelfPermission(mContext, PERMISSION_SMS);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            isSmsPermissionOk = false;
        } else {
            isSmsPermissionOk = true;
        }
        return isSmsPermissionOk;
    }

    /**
     * 獲取短信權限
     */
    public void getSmsPermission() {
        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, PERMISSION_SMS)) {
        } else {
            ActivityCompat.requestPermissions((Activity) mContext, new String[]{PERMISSION_SMS}, REQUEST_CODE_SMS);
        }
    }

    /**
     * 檢查存儲權限
     *
     * @return true已獲取存儲權限,false未獲取存儲權限
     */
    public boolean checkStoragePermission() {
        int permission = ActivityCompat.checkSelfPermission(mContext, PERMISSION_STORAGE);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            isStoragePermissionOk = false;
        } else {
            isStoragePermissionOk = true;
        }
        return isStoragePermissionOk;
    }

    /**
     * 獲取存儲權限
     */
    public void getStoragePermission() {
        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, PERMISSION_STORAGE)) {
        } else {
            ActivityCompat.requestPermissions((Activity) mContext, new String[]{PERMISSION_STORAGE}, REQUEST_CODE_STORAGE);
        }
    }

    public boolean isAllPermissionOk() {
        return isAllPermissionOk;
    }

    public boolean isCalendarPermissionOk() {
        return isCalendarPermissionOk;
    }

    public boolean isCameraPermissionOk() {
        return isCameraPermissionOk;
    }

    public boolean isContactsPermissionOk() {
        return isContactsPermissionOk;
    }

    public boolean isLocationPermissionOk() {
        return isLocationPermissionOk;
    }

    public boolean isMicrophonePermissionOk() {
        return isMicrophonePermissionOk;
    }

    public boolean isPhonePermissionOk() {
        return isPhonePermissionOk;
    }

    public boolean isSensorsPermissionOk() {
        return isSensorsPermissionOk;
    }

    public boolean isSmsPermissionOk() {
        return isSmsPermissionOk;
    }

    public boolean isStoragePermissionOk() {
        return isStoragePermissionOk;
    }

    public boolean isCustomPermissionOk() {
        return isCustomPermissionOk;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章