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