一個好用的動態權限請求工具


一個好用的動態權限請求工具

工具類參考自GitHub上開源工程Blankj的AndroidUtilCode中的PermissionUtils 和tbruyelle的RxPermissions

項目地址:https://github.com/bluetomcat/PermissionsUtils

優點
  • 採用敏感權限組和AndroidManifest中聲明的權限管理動態權限申請,可以省略查找哪些敏感需要動態申請的過程。
  • 採用內置Fragment管理請求回調,使用時無須手動重寫public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)方法。
  • 採用builder設計模式,鏈式編程
使用方法

項目的build.gradle配置

allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}

modulebuild.gradle配置

dependencies {
	        implementation 'com.github.bluetomcat:PermissionsUtils:1.0'
	}
請求示例

AndroidManifest.xml文件:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>//測試manifest文件中多餘動態權限

動態權限請求的Activity/Fragment中:

val request = PermissionUtils.builder()
            .permission(
                Manifest.permission_group.STORAGE,
                Manifest.permission_group.CALENDAR,
                Manifest.permission_group.PHONE,
                Manifest.permission_group.SENSORS//測試申請時多餘動態權限
            )
            .setResultListener(object : FullCallback {
                override fun onDenied(
                    permissionsDeniedForever: MutableList<String>?,
                    permissionsDenied: MutableList<String>?
                ) {
                    if (permissionsDeniedForever != null) {
                        for (permission in permissionsDeniedForever) {
                            Log.e(TAG, "DeniedForever:" + permission)
                        }
                    }
                    if (permissionsDenied != null) {
                        for (permission in permissionsDenied) {
                            Log.e(TAG, "Denied:" + permission)
                        }
                    }
                }
                override fun onFinish() {
                    Log.e(TAG, "onFinish");
                }

                override fun onGranted(permissionsGranted: MutableList<String>?) {
                    if (permissionsGranted != null) {
                        for (permission in permissionsGranted) {
                            Log.e(TAG, "Granted:" + permission)
                        }
                    }
                }
            })
            .setRationale(Manifest.permission_group.PHONE)//可省
            .build(this)
            .request()

實際動態申請的權限(設置的需申請的動態權限組合所含權限集合與AndroidManifest文件中聲明的權限集合的交集):

android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.WRITE_CALENDAR
android.permission.READ_PHONE_STATE
PermissionUtils類中API說明
  • builder() :靜態方法,獲取Builder對象
  • permission(@Permission String... permissions)Builder對象中的方法,設置需要動態請求的敏感權限組(動態申請的權限就是這裏設置的權限組中的權限集和AndroidManifest文件中聲明的權限集的交集)
  • setResultListener(ResultListener listener)Builder對象中的方法,設置權限請求結果監聽(內置FullCallbackSimpleCallback兩個接口回調,詳情後面單獨說明)
  • setRationale(@Nullable @Permission String... permissions)Builder對象中的方法,設置需要重複請求的權限組,不常用,可省
  • build(FragmentActivity activity)build(Fragment fragment)Builder對象中的方法,構建PermissionUtils對象,參數爲支持包中的FragmentActivity /Fragment
  • isGranted(final String... permissions)PermissionUtils對象中的方法,判斷權限組中所需動態申請的權限是否全部已通過,通過內置的Fragment對象判斷
  • isGranted(final String permission)PermissionUtils對象中的方法,判斷動態權限是否申請通過,通過內置的Fragment對象判斷
  • request()PermissionUtils對象中的方法,開始請求動態權限
  • onDestroy()PermissionUtils對象中的方法,綁定了buildFragmentActivity /Fragment的生命週期,自動在其onDestroy()方法中調用
SimpleCallback接口說明

動態權限請求結果回調,其API僅在權限請求全部結束後調用,具體說明如下:

  • onDenied():申請的權限存在被拒絕的權限時調用
  • onGranted():申請的權限全部通過時調用
FullCallback接口說明

動態權限請求結果回調,其API說明如下:

  • onGranted(List<String> permissionsGranted):每次請求循環結束後,申請的權限存在被通過的權限時調用,參數是通過的權限集合
  • onDenied(List<String> permissionsDeniedForever, List<String> permissionsDenied):每次請求循環結束後,申請的權限存在被拒絕的權限時調用,參數是被永久拒絕的權限集合和被拒絕的權限集合
  • onFinish():所有請求結束後調用
參考文檔

PermissionUtils.Java:https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
RxPermissions:
https://github.com/tbruyelle/RxPermissions


注:能力有限,如有不足歡迎大神指教,萬分感謝!!!

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