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