標籤:util perm oid card xxx else 理解 stp this
最近做了一個關於相簿的小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"/>
二,以下是一下代碼,我也是找來的,有連結,主要是加以解說,更好理解。下面是一個類,主要判斷有沒有授權,沒有授權就授權
/*
* 借用博主的代碼實現訪問外部儲存 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);
}
關於獲得安卓外部儲存讀寫權限