Android开发获取内存卡路径

        习惯了iOS开发的沙盒储存,对于Android开发的SD卡储存不怎么了解,最近做一个Android TV项目特地研究了下Android数据本地化存储;对于大部分Android大文件存储例如,视频文件一般都会存到SD卡上,之前做手机时一直用getExternalStorageDirectory()路径存储数据,而且很好用;这次需求是必须存到外置SD卡,研究了下Android仪器(Android盒子)发现自带4个USB插口一个SD卡插口,着实头疼了,心想这获取的路径怎么也应该是一个数组,于是就去度娘,发现果然有猫腻。

介绍内存卡路径前先来介绍几个概念


        一、相对路径和绝对路径
        绝对路径是指书写文件的完整路径,例如d:\java\Hello.java,该路径中包含文件的完整路径d:\java以及文件的全名Hello.java。使用该路径可以唯一的找到一个文件,不会产生歧义。但是使用绝对路径在表示文件时,受到的限制很大,且不能在不同的操作系统下运行,因为不同操作系统下绝对路径的表达形式存在不同。

相对路径是指书写文件的部分路径,例如\test\Hello.java,该路径中只包含文件的部分路径\test和文件的全名Hello.java,部分路径是指当前路径下的子路径,例如当前程序在d:\abc下运行,则该文件的完整路径就是d:\abc\test。使用这种形式,可以更加通用的代表文件的位置,使得文件路径产生一定的灵活性。


        二、内部存储(internal storage)和外部存储(external storage)的概念区分和实际位置
        注意内部存储不是内存。内部存储位于系统中很特殊的一个位置,如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。从技术上来讲如果你在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一般用Context来获取和操作。


获取内存卡路径
1、/storage/external_storage/sdcard1/
返回的是机身内置存储此,时为绝对路径,不建议使用,因为一般手机型号不同,返回的路径可能不同。

2、Environment.getExternalStorageDirectory().getCanonicalPath()
此时获取的一般为手机内置储存位置(根据手机的不同,返回结果可能不同)。

3public staticStringgetSDPathFirst(){
    StorageManager sm = (StorageManager) MboxApplication.instance.getBaseContext().getSystemService(Context.STORAGE_SERVICE);
    String[] paths = new String[6];
    try {
        paths = (String[]) sm.getClass().getMethod("getVolumePaths", new  Class[ 0 ]).invoke(sm, new  Object[]{});
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }
    if (paths.length >= 3){
        return paths[1];//经过验证下标为1时为外置sd卡路径,2时为机身内置储存
    }else {
        Toastutils.show("请插入SD卡",2);
        return null;
    }
}
此时获取的为SD卡路径

参考文章:http://blog.csdn.net/androidwifi/article/details/17725989


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值