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高手进阶教程(二十)之---Android与JavaScript方法相互调
  2. android中的坐标系以及获取坐标的方法
  3. Android与JavaScript方法相互调用
  4. 创建Android库的方法及Android .aar文件用法小结
  5. Android各种资源引用的方法
  6. Android 性能优化的一些方法
  7. android 让一个控件按钮居于底部的几种方法

随机推荐

  1. ANDROID – 使用特定的URL开启应用程序
  2. 获取Android正在运行的任务和服务
  3. Unable to execute dex: Multiple dex fi
  4. 说说在 Android(安卓)如何在全局获取 Con
  5. 16 个Android(安卓)开发者必备工具资源
  6. Android中 加载一张大图片Caused by: jav
  7. tab上显示数字
  8. android开发环境
  9. Android(安卓)ListView组件中android:dra
  10. xamarin android 如何创建一个服务