最近在给一个应用里面做一个内置的文件管理器,期间遇到一个问题,就是选择不同手机的sd卡存储和手机本身存储。可以在两者之间来回切换,经过一系列测试发现,现在的很多手机厂家定制的手机内存和sd卡内存的路径都不同,用android系统自带的api无法准确获取区分sd卡和手机自身的准确路径,比如再一台手机上获取的手机的路径是/storage/emulated/0。很可能在另外一个手机上用同样的方法获取到的就不是这个路径。
下面给出解决方案,大致思路是:首先获取到手机(设备)中所有的存储路径,包括 手机自身的存储路径,sd卡存储路径,其他存储路径。返回的是一个存放路径的String数组。然后我们对数组进行处理,一般第一位元素arr[0]就是手机自身的存储路径,arr[1]就是外置sd卡的存储路径。
获取到路径了,我们接下来就可以进行其他操作了。
下面是代码

/**     * 得到所有的存储路径(内部存储+外部存储)     *      * @param context     * @return     */    public static String[] getAllSdPaths(Context context) {        Method mMethodGetPaths = null;        String[] paths = null;         //通过调用类的实例mStorageManager的getClass()获取StorageManager类对应的Class对象          //getMethod("getVolumePaths")返回StorageManager类对应的Class对象的getVolumePaths方法,这里不带参数          StorageManager mStorageManager = (StorageManager)context                .getSystemService(context.STORAGE_SERVICE);//storage        try {            mMethodGetPaths = mStorageManager.getClass().getMethod("getVolumePaths");            paths = (String[]) mMethodGetPaths.invoke(mStorageManager);        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return paths;    }

接下来是在ManiActivity中进行调用

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        strAllPath = FilesUtils.getAllSdPaths(this);        initView();// 控件初始化        setLayout();// 视图切换        moblieStorgePath = strAllPath[0];// 手机        sDStorgePath = strAllPath[1];// sd卡        Log.e("moblieStorgePath", moblieStorgePath + "");        Log.e("strAllPath", strAllPath.length + "");        Log.e("strAllPath[0]", strAllPath[0]);        Log.e("strAllPath[1]", strAllPath[1]);

运行结果log:

经过与手机自带文件管理器比对,strAllPath[0]为手机自身的储存,strAllPath[1]为我的sd卡存储。已经在oppo r9s ,红米1s,小米2s上测试均可用。

更多相关文章

  1. Android(安卓)如何获取应用签名,微信需要的签名是MD5还是SHA1?
  2. 局域网内android设备发现及通讯
  3. Android(安卓)View获取坐标值、相对距离的方法
  4. 浅析android适配器adapter中的那些坑
  5. Android开发的第一个例子(内附Sdk、Android(安卓)studio的下载)
  6. android安全问题(一) 静音拍照与被拍
  7. android调用webservice实现手机归属查询
  8. Android重力感应器入门介绍
  9. Android(安卓)Studio获取开发版SHA1值和发布版SHA1值的史上最详

随机推荐

  1. Android(安卓)Handler
  2. Android的onCreateOptionsMenu()创建菜单
  3. android fragment 使用name关联Fragment
  4. Android如何代码混淆
  5. android四种动画
  6. Android(安卓)L下载
  7. 整理Android的列表的一行布局
  8. android背景选择器selector用法、自定义B
  9. Android(安卓)工程在4.0基础上混淆
  10. Android: 模拟器system分区没有可用空间