Android(安卓)sd卡操作的一些坑
16lz
2021-12-04
1、android的sd卡的分类 内置sd卡,外置sd卡,内置sd卡并非android的机身存储,android的机身存储包含外置sd卡,而外置sd卡又分为机身外置存储,挂载的sd卡存储,其中Environment.getExternalStorageDirectory() 方法获取到的是android中机身的外置sd卡路径
2、如果我们要操作android挂载的sd卡并且在挂载的sd卡上读写文件就需要我们使用反射获取到挂载sd卡的路径,获取挂载sd卡路径的方法
public static String getStoragePath(Context pContext) { final StorageManager storageManager = (StorageManager) pContext.getSystemService(Context.STORAGE_SERVICE); try { //得到StorageManager中的getVolumeList()方法的对象 final Method getVolumeList = storageManager.getClass().getMethod("getVolumeList"); //--------------------------------------------------------------------- //得到StorageVolume类的对象 final Class<?> storageValumeClazz = Class.forName("android.os.storage.StorageVolume"); //--------------------------------------------------------------------- //获得StorageVolume中的一些方法 final Method getPath = storageValumeClazz.getMethod("getPath"); Method isRemovable = storageValumeClazz.getMethod("isRemovable"); Method mGetState = null; //getState 方法是在4.4_r1之后的版本加的,之前版本(含4.4_r1)没有 // (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/android/os/Environment.java/) if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { try { mGetState = storageValumeClazz.getMethod("getState"); } catch (NoSuchMethodException e) { e.printStackTrace(); } } //--------------------------------------------------------------------- //调用getVolumeList方法,参数为:“谁”中调用这个方法 final Object invokeVolumeList = getVolumeList.invoke(storageManager); //--------------------------------------------------------------------- final int length = Array.getLength(invokeVolumeList); for (int i = 0; i < length; i++) { final Object storageValume = Array.get(invokeVolumeList, i);//得StorageVolum对象 final String path = (String) getPath.invoke(storageValume); final boolean removable = (Boolean) isRemovable.invoke(storageValume); if (mGetState != null) { if (removable){ return path; } } } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; }
3、对于挂载SD卡的读写操作仅限于有限的目录,要写入文件只能卸载.../android/包名/下边
4、注意:在对挂载的sd卡进行写入之前必须调用context.getExternalFilesDirs(Environment.DIRECTORY_PICTURES);方法穿件文件,建议在application中调用,方法中传入的参数,具体可以查看源码
更多相关文章
- Android主流三方库源码分析(五、深入理解RxJava源码)
- Android技术点总结
- 【Android】Webview与JavaScript交互介绍
- Android高手进阶教程(二十)之---Android与JavaScript方法相互调
- Android进程与线程基本知识
- Android高手进阶教程(二十)之---Android与JavaScript方法相互调
- android中的坐标系以及获取坐标的方法
- android设置Activity背景色为透明的2种方法
- Android与JavaScript方法相互调用