Android6.0如何判断有无外置SD卡(TF卡),并读写
来源:互联网 发布:wordpress 程序员主题 编辑:程序博客网 时间:2024/06/05 17:09
安卓6.0已经发布一段时间了,不过安卓6.0的新特性仍在发掘中。现在,又有一个有趣的新特性被发现了——安卓6.0可以把microSD卡也就是TF卡,作为设备的内置存储使用。这个新特性之所以被发现得晚,大概是由于能够率先升级安卓6.0的Nexus设备不支持TF卡扩展吧。
在之前,安卓系统虽然可以支持TF卡扩展,但TF卡扩展的容量只能当成外置存储。虽然用户可以把照片、音乐等内容放进去,但App不能安装到其中。在安卓6.0中,当首次插入TF卡的时候,系统会询问会将TF卡作为外置还是内置储存。如果选择作为内置存储,系统则会对TF卡格式化并加密——注意,这会丢失数据!然后,TF卡的容量就和设备的内置存储融合了。
一般来说,设备的内置存储速度会比TF卡快上不少,稳定性也更高,因此如果不是容量特别紧张,并不建议把TF当成内置储存植入。同时,市面上支持TF卡扩展的安卓设备也越来越少,安卓6.0的这个新特性也许会遭到冷遇。
Android手机上的外置SD卡,起初的时候,即在Android出世的前几年,那时手机的存储是十分有限的,不像现在到处可见16G、32G和64G的存储,因而那时候的手机有的厂商允许插入外置的SD卡,此时这张卡仍处于手机的扩展部分。后来,随着手机的发展以及存储能力的增加,这张外置SD卡,逐渐成为了手机的一部分,不再允许可插拔了,当然现在依然有的手机允许对存储进行拓展,比如三星等。
那张拓展的存储卡,现在叫做TF卡,且不是所有的手机都支持它,但是有时候有些奇葩需求偏要优先存储在TF卡里面,这叫不得不要求开发人员去检查这张卡是否存在、是否可用。又因为这是手机厂商可拓展、可自定义的部分,所有不同厂商生产的手机,以及同一厂商生产的不同型号的手机,TF卡的位置都相差很大,并没有一个统一的名称或位置。因而这是比较困难的一部分,但是还好Android是开源的,我们可以通过运行时来判断手机是否有TF卡,以及TF卡是否可用。
下面这个方法可以获取手机的可以存储,包括SD卡、TF卡等,对多存储卡进行了匹配,详细的代码如下
写在最前面:
由于公司的项目里有个视频下载的功能,而且这个是产品比较重要的功能。但是,由于众所周知的原因,通过传统方式获取的SD卡路径,在不同厂商的设备上都不准确,可能SD卡和内存存储介质倒置了,也可能获取出来的路径无法读写。就算是相同厂商不同的产品,获取出来的SD卡路径和内置存储路径都是五花八门。
网上到处找资料,还是没法完全解决上述问题,连有些主流的机型都无法覆盖。经过一段时间探索,算是解决了问题。
Environment里有这样一个方法isExternalStorageRemovable(),注释如下,大概意思是:
如果返回true,external storage是用户可以移除的,如SD卡、U盘(这一项是我自己加的)等。如果返回false,说明external是集成到设备中的,不可以进行物理移除。
核心:SD卡对系统而言是可移除的,而内置存储不可以移除。
解决思路有多种:
第一种:
用反射,调用
StorageManager类的隐藏方法
- getVolumeList()
和
StorageVolume类的隐藏方法
- getPath()
- isRemovable()
- getState()
这里需要注意的是getState方法不一定在所有版本中都有,对比多个版本的源码后得知,此方法是在4.4_r1之后新增的,使用时需要注意,要判断磁盘的挂载状态,不能只依赖getState。另外,不要试图调用StorageVolume类中的其它方法,原因上面提过,本人也对比过,有些方法在其它版本中不一定有,比如isPrimary()——是否是主存储器,就是在4.2_r1版本之后才有的方法。
第二种:
看系统设置APP中Storage模块的具体实现。既然系统设置中可以正确的获取到SD卡位置,那么可以看看SettingActivity到底是怎么做的(我还没有具体去看,但可以确定的是,SettingActivity里也利用了StorageManager的隐藏方法,只不过SettingActivity里用的是getDisks()来获取磁盘信息,如果要用这些方法,还是得用反射)。
- Setting模块的源码:
https://github.com/android/platform_packages_apps_settings/tree/master/src/com/android/settings
- Storage模块的位置:
- Deviceinfo/StorageSettings
- clone到AndroidStudio里更方便查看。
StorageSettings.java
第三种:
这个是看得别人的,在Environment类里找到的方法。但是,也是由于版本问题,在部分低版本和高版本上无法使用,所以不建议使用。两行代码:
- SD卡:System.getenv(“SECONDARY_STORAGE“)
- 内置存储:System.getenv(“EXTERNAL_STORAGE“)
他们返回的都是path
这里使用第一种方法,具体步骤(完整代码后在会面贴出):
①.获取StorageManager
②.反射得到StorageManger里的getVolumeList()方法
③.反射得到StorageVolume类的对象
④.反射得到StorageVolume类里的getPath()、isRemovable()、getState()方法
⑤.反射获取属性的核心方法,最终会得到每个StorageVolume对象的path、removable和state属性。
经过这几步,SD卡路径已经能完美获取了,而且准确无误(就目前测试过的设备而言)。具体代码可以下载我写的demo。
源码戳这里:https://github.com/gongshoudao/SDcardScanner
如果今后有时间,再研究一下上面提到的第二种方式。
博客参考 http://blog.csdn.net/zqs62761130/article/details/42464785
http://vjson.com/wordpress/%E8%8E%B7%E5%8F%96android%E8%AE%BE%E5%A4%87%E6%8C%82%E8%BD%BD%E7%9A%84%E6%89%80%E6%9C%89%E5%AD%98%E5%82%A8%E5%99%A8.html
- Android6.0如何判断有无外置SD卡(TF卡),并读写
- 判断手机有无外置sd卡
- Android6.0 在外置SD卡 读写问题.....
- 教你如何把程序安装到外置sd卡(tf卡)上。(教程)
- Android6.0 平台应用获取外置sd卡路径
- 全志A64 android6.0系统允许第三方应用读写U盘外置sd卡修改
- 关于android4.4外置sd卡读写
- Android获取外置SD卡读写路径
- Android6.0新特性把外置TF卡作为内置存储使用
- Android手机外置SD卡(TF卡)的获取方法
- Android判断获取内置外置sd卡
- 在Android6.0上给外置SD卡增加一个路径
- 如何获取外置的SD卡路径
- Android6.0 读写SD卡权限动态申请
- Android6.0动态申请SD卡读写的权限
- Android6.0动态申请SD卡读写的权限
- Android6.0 读写SD卡权限动态申请
- android得到外置sd卡路径和判断外置sd卡是否卸载
- 207. Course Schedule 难度:medium 类别:图
- fd_set 用法
- C语言基础学习运算符-逻辑运算符
- Eclipse安装JD-Eclipse反编译插件
- 江西SEO:软文推广需要掌握的几大技巧
- Android6.0如何判断有无外置SD卡(TF卡),并读写
- 2016.09.24【初中部 NOIP提高组 】模拟赛C
- OpenGL系列教程之九:OpenGL像素缓冲区对象(PBO)
- extern c的作用
- ISDEV : fatal error -6109: Internal build error
- 第五周项目1(7)
- C++ 面向对象程序设计上机练习二(函数模板)
- 三大指令与(pagecontext域)**以及javaBean以及EL表达式
- Ubuntu14.04下配置和使用NFS文件系统服务