Android框架式編程之EasyPermissions


EasyPermission庫是一個谷歌官方提供的簡化基本的系統權限邏輯的庫,可用於在Android M或者更高版本上。

官方項目地址:https://github.com/googlesamples/easypermissions

一、EasyPermission配置依賴

在需要使用此庫的module的build.gradle中添加以下代碼:

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使用流程

1. 使用EasyPermissions檢查權限:

權限可以是單個,也可以是一些列。在EasyPermission庫中,使用EasyPermissions#hasPermissions(...)檢查若干權限。

/**
*
* @param context
* return true:已經獲取權限
* return false: 未獲取權限,主動請求權限
*/

public static boolean checkPermission(Activity context,String[] perms) {
  return EasyPermissions.hasPermissions(context, perms);
}

EasyPermissions.hasPermissions():

第一個參數 : Context參數.例如,Activity對象。

第二個參數 : 一些系列的權限。例如,public final static String[] PERMS_WRITE ={Manifest.permission.WRITE_EXTERNAL_STORAGE};

2. 使用EasyPermissions請求權限:

檢查后,發覺用戶沒有賦予權限,這時候需要代碼請求權限,讓用戶同意。

在EasyPermission庫中,使用EasyPermissions#requestPermissions,來請求權限。

/**
* 請求權限
* @param context
*/
public static void requestPermission(Activity context,String tip,int requestCode,String[] perms) {
  EasyPermissions.requestPermissions(context, tip,requestCode,perms);
}

EasyPermissions.requestPermissions():

第一個參數:Context對象
第二個參數:權限彈窗上的文字提示語。告訴用戶,這個權限用途。
第三個參數:這次請求權限的唯一標示,code。
第四個參數 : 一些系列的權限。

3. EasyPermissions響應請求結果:

請求后,彈出系統權限彈窗,剩下是用戶是否授權操作。權限結果是回調在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接口:

  • onPermissionsGranted():用戶授權成功,接下來執行具體需要的邏輯操作
  • onPermissionsDenied():用戶授權失敗,處理失敗的邏輯。

注意:若是在權限彈窗中,用戶勾選了’NEVER ASK AGAIN.’或者’不在提示’,且拒絕權限。 這時候,需要跳轉到設置界面去,讓用戶手動開啟。

你可能並不滿足,需要手動調用邏輯處理方法。EasyPermissions庫為你考慮好了,具備強大之處。當用戶同意權限后,可以不需要通過監聽器方式來實現,直接調用相關的邏輯代碼的方法。只需要使用@AfterPermissionGranted注解標注邏輯處理的方法。

4. @AfterPermissionGranted注解:

@AfterPermissionGranted注解為了提供方便,但可以添加也可以不添加,是可選的。

好處:

使用了該注解,當權限請求被用戶同意后,會根據請求code來執行,相應的含有@AfterPermissionGranted注解的方法。

簡化了請求成功操作流程,不需要在EasyPermissions.onRequestPermissionsResult()的回調監聽器中請求成功的方法中,再次手動調用,獲取權限后需要操作的邏輯代碼。

以下代碼,請求寫入磁盤的權限,當用戶同意權限后,彈出一個Toast彈窗的邏輯處理操作。

@AfterPermissionGranted(Constance.WRITE_PERMISSION_CODE) // 可選的
public void onPermissionsSuccess() {
  ToastUtils.showToast(getApplicationContext(), "用戶授權成功");
}

當用戶同意權限,該方法不需要手動調用,會匹配到的Constance.WRITE_PERMISSION_CODE請求碼,自動執行。

5. 使用EasyPermissions處理權限被拒的情況:

在權限彈窗中,用戶可能直接拒絕權限,下次權限請求依舊會彈出該權限彈窗。除此之外,還可以勾選’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()響應。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM