天天看點

android開發之調皮的權限

文章背景

撰寫本文的目的在于幫助開發者們解決android中動态申請權限的坑。

在android6.0以前,申請權限的方式很簡單,隻需要在清單檔案AndroidManifest.xml中申請即可。需要用到時系統會彈框提示使用者選擇需要的權限。

但是android6.0之後,權限需要進行動态申請。而且有些基礎權限也需要申請,而這些容易被開發者忽略的權限可能會導緻原本正常運作的程式出現各種各樣的坑。

本文就是為了解決這些坑,為了讓廣大開發者避免掉坑而撰寫的。

适用平台

目前适合所有android平台。

使用場景

對android6.0以上系統有大作用,相容android6.0以下系統。

畢竟android6.0以上權限才開始變得調皮,需要動态申請了。

尤其适合需要用到權限的APP。

特别是之前使用者完全沒有感覺的存儲權限的申請更加适用。

具體方案

google既然引入了動态權限申請,自然有一套API來處理。

但是google的API不夠直覺,并且比較基礎。

本人參照了一些資料,然後自己寫了一個demo,已經開源到github。

大家可以上去觀看。歡迎star、follow、提issue。

PermissionManager

下面說下具體的用法:(github上也有說明)

  1. 拷貝permission包下的所有檔案到你的項目中。
  2. 定義PermissionHelper變量。
private PermissionHelper permissionHelper;
           
  1. 在需要檢查權限的地方調用doPermissionCheck()方法。
/**
     * 檢查是否擁有權限
     */
    private void doPermissionCheck(){
        permissionHelper = PermissionHelper.getInstance(this);
        permissionHelper
                .setForceAccepting(true) // default is false. its here so you know that it exists.
                .request(permissionArrays);
    }
           

這裡的permissionArrays就是你要申請的權限的數組,目前支援申請單個權限和多個權限,隻需要在這裡配置即可。比如示例代碼:

final String[] permissionArrays = {Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_SMS};
           
  1. 實作OnPermissionCallback回調接口。
  2. 在實作的回調方法裡面做各自的事情。具體邏輯可以參考github上代碼。
//使用者點選允許權限回調
 @Override
    public void onPermissionGranted(@NonNull String[] permissionName) {
    }

    @Override
    public void onPermissionDeclined(@NonNull String[] permissionName) {
    }

 //權限已經打開了
    @Override
    public void onPermissionPreGranted(@NonNull String permissionsName) {
    }

    //需要申請權限
    @Override
    public void onPermissionNeedExplanation(@NonNull String permissionName) {
        permissionHelper.requestAfterExplanation(permissionName);
    }

 //使用者點選禁止權限并且不再提示時回調
    @Override
    public void onPermissionReallyDeclined(@NonNull String permissionName) {
    }

    //android6.0以下會觸發
    @Override
    public void onNoPermissionNeeded() {
    }

    //記得手動重寫這個方法
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        permissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
           

github上的代碼示範的是一次性強制申請單個或多個權限的用法。

至于非強制性申請以及其他各種場景,各位有需要的可以評論留言或者到github上提issue。

有任何想法歡迎交流。

示範截圖如下:

權限申請

如果本文對你有所幫助,歡迎關注、喜歡、贊賞!

繼續閱讀