Android 之動態許可權的新增
對於安卓 6.0 之前許可權的處理是標膠簡單的,只需要在清單檔案中加入自己所需要的許可權就可以了,但是隨著谷歌對許可權的稽核變的嚴厲起來之後,在 targetSdkVersion 23 以上就需要動動態申請許可權了,下面我就來介紹一下怎麼動態申請許可權,其中包括加入許可權的邏輯和處理許可權的邏輯,還有推薦的一些比較好用的庫。
一: 新增許可權的邏輯
1. 在你需要加入許可權的地方請求許可權,不是已進入到程式就全部請求一遍你所需要的許可權,這樣的會讓使用者很反感,得不到很好的使用者體驗,比如說 : 你在點選某個按鈕的時候,需要加入掃描地址的許可權,你就在這個點選事件的時候去對這個許可權的加入,這樣實現起來使用者也知道他現在正在操作的是什麼,使用者體驗比較到位。
2. 加入許可權的時候一般分為如下的幾個步驟:
(1) 許可權的檢查,先檢查有沒有你需要加入的許可權,還有核對你核對版本是否是 6.0 以上還是 6.0 以下
(2) 加入許可權之後的對話方塊處理, 如果使用者點選允許新增許可權,就直接給個簡答你的吐司提示就好了,如果使用者點選了拒絕新增許可權,我也以一個點選事件舉例說明的吧,使用者拒絕了許可權的新增,再次點選的時候,還是需要彈出許可權的提示框,讓使用者去選擇要新增的許可權,如果使用者再次點了對話方塊中的不在提示再次拒絕了許可權的申請,使用者再次點選功能按鈕時,直接要跳到手機的設定介面,讓使用者強制開啟許可權,才能正常的使用該功能。
二:舉例說明
安卓 6.0 以上的危險許可權有:
申請執行時許可權,我是使用了谷歌推出的 easypermissions ,此庫功能還是比較齊全的,使用也比較簡單,下面就針對這個庫的使用來理解一下許可權的新增
1. 依賴的新增
dependencies { implementation 'pub.devrel:easypermissions:1.3.0' }
2. 再在清單檔案中宣告要申請的危險許可權,如果不宣告的話,直接在程式碼中寫也能申請成功,但是好想不會彈出詢問框,直接就申請了。
3. 申請許可權,可以直接申請
EasyPermissions.requestPermissions( MainActivity.this, "申請許可權", 0, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO);
最好還是檢查一下許可權是否申請:
EasyPermissions.hasPermissions(Context context, @NonNull String… perms)方法來檢測一個或者多個許可權是否被允許,第二個引數是個可變陣列,可以申請多個
String[] perms = {Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION}; if (EasyPermissions.hasPermissions(this, perms)) { // 已經申請過許可權,做想做的事 } else { // 沒有申請過許可權,現在去申請 EasyPermissions.requestPermissions(this, getString(R.string.camera_and_location_rationale), RC_CAMERA_AND_LOCATION, perms);
4. 重寫 onRequestPermissionsResult() 方法,把執行操作給 easyPermissions
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); }
5. 實現EasyPermissions.PermissionCallbacks介面,重寫兩個方法
public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// 把執行結果的操作給EasyPermissions EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); }
@Override //申請成功時呼叫 public void onPermissionsGranted(int requestCode, List<String> list) { //請求成功執行相應的操作 比如,舉個例子 switch (requestCode){ case 0: Toast.makeText(this, "已獲取WRITE_EXTERNAL_STORAGE許可權", Toast.LENGTH_SHORT).show(); break; case 1: Toast.makeText(this, "已獲取WRITE_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE許可權", Toast.LENGTH_SHORT).show(); break; } }
@Override //申請失敗時呼叫 public void onPermissionsDenied(int requestCode, List<String> list) { // 請求失敗,執行相應操作 } }
6. 如果使用者點了不在允許拒接了許可權,那麼就要重新這個方法 onPermissionsDenied
@Override public void onPermissionsDenied(int requestCode, List<String> perms) { //處理許可權名字字串 StringBuffer sb = new StringBuffer(); for (String str : perms){ sb.append(str); sb.append("\n"); } sb.replace(sb.length() - 2,sb.length(),"");
switch (requestCode){ case 0: Toast.makeText(this, "已拒絕許可權" + perms.get(0), Toast.LENGTH_SHORT).show(); break; case 1: Toast.makeText(this, "已拒絕WRITE_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE許可權"+ perms.get(0), Toast.LENGTH_SHORT).show(); break; } if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) { Toast.makeText(this, "已拒絕許可權" + sb + "並不再詢問" , Toast.LENGTH_SHORT).show(); new AppSettingsDialog .Builder(this) .setRationale("此功能需要" + sb + "許可權,否則無法正常使用,是否開啟設定") .setPositiveButton("是") .setNegativeButton("否") .build() .show(); } }
至此,執行時許可權就大致講解完了,有錯誤之處,希望各位大佬多多指教。