Android6.0運行時權限-sd卡權限處理方式

vicktoliam 8年前發布 | 55K 次閱讀 安卓開發 Android開發 移動開發

我們的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

 

 本文由用戶 vicktoliam 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!