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

原创 2016年09月26日 17:13:24

 安卓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模块的位置:
    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

版权声明:本文为博主原创文章,未经博主允许不得转载。Android北京开发技术群 482266514密码CSDN

android 6.0文件写入外置SD卡的问题!

在5.0之前开发如果要把文件写入到某一个地方,你只需要: public static String createSDCardDir(String folatName){ Str...

【Android应用】 6.0代码申请权限 向SD卡写入文件

【声明】我不会一步一步带您剖析原理(大牛很多如果深入讲解也轮不到我 (*^__^*) 嘻嘻……),只会总结可用好用的与您分享...
  • ESCIC
  • ESCIC
  • 2016年10月10日 09:43
  • 5497

Android 检测SD卡状态

if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // sd card 可用 }else ...

Android-->检测内置/外置SD卡存储卡,枚举所有挂载点(通过反射实现),监听SD卡广播

直接上重点:1:获取内置SD卡的路径, 但是判断是否有效(是否挂载), 需要用到下面检测挂载点的方法 /** * 获取内置SD卡路径 * * @return ...
  • angcyo
  • angcyo
  • 2015年05月29日 11:39
  • 3984

如何区分手机内置存储卡与外置存储卡

android系统自从升级到2.3以后,多一个功能,可以判断存储卡是否是可以卸载的。Environment.isExternalStorageRemovable(),通过此方法我们可以知道手机上的存储...
  • JJMM2009
  • JJMM2009
  • 2013年10月17日 13:45
  • 14983

Android 判断SD卡是否存在及容量查询

Android 判断SD卡是否存在及容量查询的简单方法如下: 首先要在AndroidManifest.xml中增加SD卡访问权限   SD卡是否存在 private boolean E...

android中对u盘以及tf卡插入的广播监听

public class UsbStateReceiver extends BroadcastReceiver { //BroadcastReceiver private String T...
  • mo_hen_
  • mo_hen_
  • 2016年10月18日 18:21
  • 2080

Android6.0新特性把外置TF卡作为内置存储使用

之前外界曾一度认为谷歌要在Android中淘汰掉MicroSD卡,但从安卓5.0开始这个情况缓和了很多,而谷歌也允许开发者将更多MicroSD卡功能恢复。 Android 5.0中,...

在Android6.0上给外置SD卡增加一个路径

看了前面的博客大家都发现,android6.0上vold对外置sd卡挂载都采用在storage增加一个sd卡的uuid的名字,作为文件名。 但是之前我们系统中很多系统应用都是直接写死的外置sd卡路径...

android5.0与6.0 sd卡挂载

Adb remount Adb shell Cd system/etc Cat vold.fstab Cd dev/block ls android 5.1 vold.fstab 显示为 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android6.0如何判断有无外置SD卡(TF卡),并读写
举报原因:
原因补充:

(最多只允许输入30个字)