1. 程式人生 > >關於獲得安卓外部存儲讀寫權限

關於獲得安卓外部存儲讀寫權限

卸載 界面 IV 訪問 oid utils sdc AC 解決

最近做了一個關於相冊的小App,需要對安卓手機的存儲設備進行讀取,首先需要獲取系統讀寫權限,在網上一頓好找,對於老手來說,可能很容易,對於菜鳥來說,就有點困難了,為了容易學習,特把自己寫的一些心得寫下,用以參考。如有不當之處,歡迎指正。

首先做一個關於手機內部存儲和外部存儲之間的介紹:

對內部存儲設備不需要申請讀寫權限,一般是自動分配給手機的,在卸載app時消失:用getFileDirs()直接獲取/data/data/packageName/files/xxx.

外部存儲設備一般需要獲取路徑需要Environment.getExternalStorageDirectory()方法獲取/storage/emulate/0/,親測小米手機

一,主要是由於安卓6.0之後只在Manifest文件中寫上這兩個權限列表,已經不行了,需要寫代碼動態申請權限

<!--權限列表-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

二,以下是一下代碼,我也是找來的,有鏈接,主要是加以解說,更好理解。下面是一個類,主要判斷有沒有授權,沒有授權就授權
/*
* 借用博主的代碼實現訪問外部存儲 https://blog.csdn.net/qq_23335213/article/details/78081114
* */

/**
* 關於申請授權
* 只需要在主界面申請一次即可
* 在其他子activity,自動授權
* */
public class PermissionUtils {
//這是要申請的權限
private static String[] PERMISSIONS_CAMERA_AND_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA};

/**
* 解決安卓6.0以上版本不能讀取外部存儲權限的問題
*
* @param activity
* @param requestCode
* @return
*/
public static boolean isGrantExternalRW(Activity activity, int requestCode) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

int storagePermission = activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
int cameraPermission = activity.checkSelfPermission(Manifest.permission.CAMERA);
//檢測是否有權限,如果沒有權限,就需要申請
if (storagePermission != PackageManager.PERMISSION_GRANTED ||
cameraPermission != PackageManager.PERMISSION_GRANTED) {
//申請權限
activity.requestPermissions(PERMISSIONS_CAMERA_AND_STORAGE, requestCode);
//返回false。說明沒有授權
return false;
}
}
//說明已經授權
return true;
}
}


三,在具體的activity中如何使用

1.調用上面的類,來申請權限,在oncreate函數裏面調用
//獲取授權 這個if..else可以不寫,直接寫權限申請代碼
if (PermissionUtils.isGrantExternalRW(this, 1)) {

}
2.onRequestPermissionResult是對activity.requestPermissions()函數的回調,根據請求碼做具體處理。如果沒有授權,自然要授權後再能使用。只需要咋入口activity中申請權限即可,其它子activity會自動被授權。此授權會在一開始打開一個請求權限頁面,點擊允許就會獲取權限
//對獲取權限處理的結果
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//檢驗是否獲取權限,如果獲取權限,外部存儲會處於開放狀態,會彈出一個toast提示獲得授權
String sdCard = Environment.getExternalStorageState();
if (sdCard.equals(Environment.MEDIA_MOUNTED)){
Toast.makeText(this,"獲得授權",Toast.LENGTH_LONG).show();
}
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "buxing", Toast.LENGTH_SHORT).show();
}
});
}
break;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

關於獲得安卓外部存儲讀寫權限