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中调用,方法中传入的参数,具体可以查看源码

更多相关文章

  1. Android主流三方库源码分析(五、深入理解RxJava源码)
  2. Android技术点总结
  3. 【Android】Webview与JavaScript交互介绍
  4. Android高手进阶教程(二十)之---Android与JavaScript方法相互调
  5. Android进程与线程基本知识
  6. Android高手进阶教程(二十)之---Android与JavaScript方法相互调
  7. android中的坐标系以及获取坐标的方法
  8. android设置Activity背景色为透明的2种方法
  9. Android与JavaScript方法相互调用

随机推荐

  1. android屏幕旋转
  2. Android(安卓)Studio如何轻松整理字符串
  3. Android(安卓)的 dex2jar 和 jd-gui 反编
  4. 第2.3节 android目录中manifest的介绍
  5. android抓包及分析
  6. Android下无法调用JRE下的sun.security.x
  7. Android开发教程之感应检测Sensor
  8. 字符串操作 — Google Guava
  9. Android中各个Activity中数据的传递
  10. Android用户界面——通用布局对象