最近作了一個關於相冊的小App,須要對安卓手機的存儲設備進行讀取,首先須要獲取系統讀寫權限,在網上一頓好找,對於老手來講,可能很容易,對於菜鳥來講,就有點困難了,爲了容易學習,特把本身寫的一些心得寫下,用以參考。若有不當之處,歡迎指正。android
首先作一個關於手機內部存儲和外部存儲之間的介紹:app
對內部存儲設備不須要申請讀寫權限,通常是自動分配給手機的,在卸載app時消失:用getFileDirs()直接獲取/data/data/packageName/files/xxx. ide
外部存儲設備通常須要獲取路徑須要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會自動被受權。此受權會在一開始打開一個請求權限頁面,點擊容許就會獲取權限//對獲取權限處理的結果@Overridepublic 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);}