最近做了一个关于相册的小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);
}