最近做了一个关于相册的小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会自动被授权。此授权会在一开始打开一个请求权限页面,点击允许就会获取权限//对获取权限处理的结果@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);}
原文地址:https://www.cnblogs.com/zanzg/p/9129375.html
时间: 2024-10-08 11:48:38