Android6.0如何判断有无外置SD卡(TF卡),并读写

 安卓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的这个新特性也许会遭到冷遇。


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模块的位置:
  1. Deviceinfo/StorageSettings
  1. 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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值