Android6.0執行時許可權-sd卡許可權處理方式
阿新 • • 發佈:2019-01-06
我們的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