EasyPermission庫是一個谷歌官方提供的簡化基本的系統權限邏輯的庫,可用於在Android M或者更高版本上。git
官方項目地址:https://github.com/googlesamples/easypermissionsgithub
在須要使用此庫的module的build.gradle中添加如下代碼:app
dependencies {
// For developers using AndroidX in their applications implementation 'pub.devrel:easypermissions:3.0.0' // For developers using the Android Support Library implementation 'pub.devrel:easypermissions:2.0.1' }
權限能夠是單個,也能夠是一些列。在EasyPermission庫中,使用EasyPermissions#hasPermissions(...)檢查若干權限。ide
/** * * @param context * return true:已經獲取權限 * return false: 未獲取權限,主動請求權限 */ public static boolean checkPermission(Activity context,String[] perms) { return EasyPermissions.hasPermissions(context, perms); }
EasyPermissions.hasPermissions():gradle
第一個參數 : Context參數.例如,Activity對象。ui
第二個參數 : 一些系列的權限。例如,public final static String[] PERMS_WRITE ={Manifest.permission.WRITE_EXTERNAL_STORAGE};this
檢查後,發覺用戶沒有賦予權限,這時候須要代碼請求權限,讓用戶贊成。google
在EasyPermission庫中,使用EasyPermissions#requestPermissions,來請求權限。spa
/** * 請求權限 * @param context */ public static void requestPermission(Activity context,String tip,int requestCode,String[] perms) { EasyPermissions.requestPermissions(context, tip,requestCode,perms); }
EasyPermissions.requestPermissions():code
第一個參數:Context對象
第二個參數:權限彈窗上的文字提示語。告訴用戶,這個權限用途。
第三個參數:此次請求權限的惟一標示,code。
第四個參數 : 一些系列的權限。
請求後,彈出系統權限彈窗,剩下是用戶是否受權操做。權限結果是回調在Activity或者Fragment中的重寫的onRequestPermissionsResult()方法中。
public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks { //.....省略部分代碼。 /** * 重寫onRequestPermissionsResult,用於接受請求結果 * * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); //將請求結果傳遞EasyPermission庫處理 EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } /** * 請求權限成功。 * 能夠彈窗顯示結果,也可執行具體須要的邏輯操做 * * @param requestCode * @param perms */ @Override public void onPermissionsGranted(int requestCode, List<String> perms) { ToastUtils.showToast(getApplicationContext(), "用戶受權成功"); }
/** * 請求權限失敗 * * @param requestCode * @param perms */ @Override public void onPermissionsDenied(int requestCode, List<String> perms) { ToastUtils.showToast(getApplicationContext(), "用戶受權失敗"); /** * 如果在權限彈窗中,用戶勾選了'NEVER ASK AGAIN.'或者'不在提示',且拒絕權限。 * 這時候,須要跳轉到設置界面去,讓用戶手動開啓。 */ if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) { new AppSettingsDialog.Builder(this).build().show(); } } }
將權限結果傳遞給EasyPermissions.onRequestPermissionsResult()來處理。
EasyPermissions.onRequestPermissionsResult()方法:
第一個參數: 請求的code
第二個參數: 一些列的請求權限
第三個參數: 用戶受權的結果
第四個參數: 權限回調監聽器
這裏不須要手寫判斷權限是否成功的邏輯操做,而會在EasyPermissions.PermissionCallbacks監聽器中響應。
EasyPermissions.PermissionCallbacks接口:
注意:如果在權限彈窗中,用戶勾選了’NEVER ASK AGAIN.’或者’不在提示’,且拒絕權限。 這時候,須要跳轉到設置界面去,讓用戶手動開啓。
你可能並不知足,須要手動調用邏輯處理方法。EasyPermissions庫爲你考慮好了,具有強大之處。當用戶贊成權限後,能夠不須要經過監聽器方式來實現,直接調用相關的邏輯代碼的方法。只須要使用@AfterPermissionGranted註解標註邏輯處理的方法。
@AfterPermissionGranted註解爲了提供方便,但能夠添加也能夠不添加,是可選的。
好處:
使用了該註解,當權限請求被用戶贊成後,會根據請求code來執行,相應的含有@AfterPermissionGranted註解的方法。
簡化了請求成功操做流程,不須要在EasyPermissions.onRequestPermissionsResult()的回調監聽器中請求成功的方法中,再次手動調用,獲取權限後須要操做的邏輯代碼。
如下代碼,請求寫入磁盤的權限,當用戶贊成權限後,彈出一個Toast彈窗的邏輯處理操做。
@AfterPermissionGranted(Constance.WRITE_PERMISSION_CODE) // 可選的 public void onPermissionsSuccess() { ToastUtils.showToast(getApplicationContext(), "用戶受權成功"); }
當用戶贊成權限,該方法不須要手動調用,會匹配到的Constance.WRITE_PERMISSION_CODE請求碼,自動執行。
在權限彈窗中,用戶可能直接拒絕權限,下次權限請求依舊會彈出該權限彈窗。除此以外,還能夠勾選’NEVER ASK AGAIN.’或者’不在提示’,且拒絕權限,下次請求權限,彈窗不能彈出,沒法讓用戶受權。這時候,須要跳轉到設置界面去,讓用戶手動開啓。
在EasyPermission庫中,使用EasyPermissions.somePermissionPermanentlyDenied()來處理,是否勾選再也不提示的選項。
/** * 請求權限失敗 * * @param requestCode * @param perms */ @Override public void onPermissionsDenied(int requestCode, List<String> perms) { ToastUtils.showToast(getApplicationContext(), "用戶受權失敗"); /** * 如果在權限彈窗中,用戶勾選了'NEVER ASK AGAIN.'或者'不在提示',且拒絕權限。 * 這時候,須要跳轉到設置界面去,讓用戶手動開啓。 */ if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) { new AppSettingsDialog.Builder(this).build().show(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { //當從軟件設置界面,返回當前程序時候 case AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE: //執行Toast顯示或者其餘邏輯處理操做 break; } }
以上代碼是,當沒法彈出權限彈框,直接跳轉到設置界面去,讓用戶手動開啓權限。
當從設置界面返回時候,結果會在Activity或者Fragment中onActivityResult()響應。