1. 程式人生 > >Android6.0執行時許可權-sd卡許可權處理方式

Android6.0執行時許可權-sd卡許可權處理方式

我們的app一般都會需要快取和一些圖片的儲存,當然我們的目錄可以是自己的私有目錄, getExternalCacheDir 或者 getCacheDir 是不需要許可權的,但是如果需要在sd卡下儲存呢,此時需要 WRITE_EXTERNAL_STORAGE 許可權.實際上 WRITE_EXTERNAL_STORAGE 許可權對於我們開發者來說是一個基礎許可權,一些IO操作都會用到,但是在6.0中屬於危險許可權,是需要動態申請的(在 manifest 宣告無效)

由於快取很可能在進入app的時候就需要,所以應用啟動後需要儘快獲取到該許可權,否則可能引起崩潰(6.0機型).

這裡採用的方案是在 MainActivity (或者啟動頁)申請這項許可權,儘量讓使用者授權

處理WRITE_EXTERNAL_STORAGE許可權

如果對6.0執行時許可權還不太瞭解的,可以參考我的上一篇文章 Android6.0執行時許可權解決方案

  • 效果圖

儲存許可權.gif

  • 程式碼:

直接在 MainActivity 的 onCreate 中申請許可權,以下為申請儲存許可權的模板

/*<=======================================全域性基礎許可權申請=================================================>*/

/**
 * 申請全域性都需要的許可權,如讀寫許可權,這些許可權是進入app就需要的,拒絕則警告使用者程式可能會崩潰
 */
private void initGlobalPer() { MainActivityPermissionsDispatcher.sucessWithCheck(this); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); MainActivityPermissionsDispatcher.onRequestPermissionsResult(this
, requestCode, grantResults);//將回調交給代理類處理 } @NeedsPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) void sucess() {//許可權申請成功 } @OnShowRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE) void showRationaleForCamera(PermissionRequest request) { showRationaleDialog("為了達到更好的使用者體驗,我們會進行快取及檔案儲存操作,需要您授予相關的儲存許可權!\n請您放心,該許可權為正常使用許可權,不會涉及到您的隱私!\n稍後請點選彈出框的允許按鈕", request); } @OnPermissionDenied(Manifest.permission.WRITE_EXTERNAL_STORAGE) void onCameraDenied() {//被拒絕 IToast.show("您拒絕了許可權,可能會導致該應用內部發生錯誤,請儘快授權"); } @OnNeverAskAgain(Manifest.permission.WRITE_EXTERNAL_STORAGE) void onCameraNeverAskAgain() {//被拒絕並且勾選了不再提醒 if (!IoHelper.getIoDontAsk()) AskForPermission(); } /** * 再使用者拒絕過一次之後,告知使用者具體需要許可權的原因 * * @param messageResId * @param request */ private void showRationaleDialog(String messageResId, final PermissionRequest request) { new AlertDialog.Builder(this) .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(@NonNull DialogInterface dialog, int which) { request.proceed();//請求許可權 } }) .setTitle("請求許可權") .setCancelable(false) .setMessage(messageResId) .show(); } /** * 被拒絕並且不再提醒,提示使用者去設定介面重新開啟許可權 */ private void AskForPermission() { new AlertDialog.Builder(this) .setTitle("缺少基礎儲存許可權") .setMessage("當前應用缺少儲存許可權,請去設定介面授權.\n授權之後按兩次返回鍵可回到該應用哦") .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { IToast.show("您拒絕了許可權,可能會導致該應用內部發生錯誤,請儘快授權"); } }) .setNeutralButton("不在提醒", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { IoHelper.putIoDontAsk(true); IToast.show("將不再提醒請求基礎許可權,建議儘快授權"); } }).setPositiveButton("設定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse("package:" + getPackageName())); // 根據包名開啟對應的設定介面 startActivity(intent); } }).create().show(); } /*<========================================================================================>*/
  • 在 MainActivity 中獲取到儲存許可權,可以很好的避免因為快取等讀寫許可權問題引起的崩潰.

來自:http://www.jianshu.com/p/36b074426d17