Android sd卡操作的一些坑

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

猜你喜欢

转载自blog.csdn.net/coward_/article/details/81486105
今日推荐