Android手机外置SD卡(TF卡)的获取方法
2014-07-25 16:27
351 查看
Android手机上的外置SD卡,起初的时候,即在Android出世的前几年,那时手机的存储是十分有限的,不像现在到处可见16G、32G和64G的存储,因而那时候的手机有的厂商允许插入外置的SD卡,此时这张卡仍处于手机的扩展部分。后来,随着手机的发展以及存储能力的增加,这张外置SD卡,逐渐成为了手机的一部分,不再允许可插拔了,当然现在依然有的手机允许对存储进行拓展,比如三星等。
那张拓展的存储卡,现在叫做TF卡,且不是所有的手机都支持它,但是有时候有些奇葩需求偏要优先存储在TF卡里面,这叫不得不要求开发人员去检查这张卡是否存在、是否可用。又因为这是手机厂商可拓展、可自定义的部分,所有不同厂商生产的手机,以及同一厂商生产的不同型号的手机,TF卡的位置都相差很大,并没有一个统一的名称或位置。因而这是比较困难的一部分,但是还好Android是开源的,我们可以通过运行时来判断手机是否有TF卡,以及TF卡是否可用。
下面这个方法可以获取手机的可以存储,包括SD卡、TF卡等,对多存储卡进行了匹配,详细的代码如下:
View Code
首先,我把它写成了一个工具类,因而声明了一个私有的构造器,目的就是要防止该类被实例化。
然后,首先获取了Android标准一部分的外置SD卡,如果它可用的话。
然后利用运行时,通过命令行函数"mount"来获取所有的存储位置,并对返回的结果进行SD卡或者TF卡的查找。
最后返回了所有可用于存储的不同的卡的位置,用一个List来保存。由于不是所有的手机都支持TF卡,因而这个List包含的路径未必很多,只有一个SD卡的手机只会返回一个路径,多个可用存储位置的会返回多个路径。
但有一点,是必须的,paths.get(0)肯定是外置SD卡的位置,因为它是primary external storage.
这是一篇有关Android存储的文章,推荐给大家,有兴趣的可以查看一下:Android存储的概念辨析及使用说明
那张拓展的存储卡,现在叫做TF卡,且不是所有的手机都支持它,但是有时候有些奇葩需求偏要优先存储在TF卡里面,这叫不得不要求开发人员去检查这张卡是否存在、是否可用。又因为这是手机厂商可拓展、可自定义的部分,所有不同厂商生产的手机,以及同一厂商生产的不同型号的手机,TF卡的位置都相差很大,并没有一个统一的名称或位置。因而这是比较困难的一部分,但是还好Android是开源的,我们可以通过运行时来判断手机是否有TF卡,以及TF卡是否可用。
下面这个方法可以获取手机的可以存储,包括SD卡、TF卡等,对多存储卡进行了匹配,详细的代码如下:
public class SDCardScanner { /* * avoid initializations of tool classes */ private SDCardScanner() { } /** * @Title: getExtSDCardPaths * @Description: to obtain storage paths, the first path is theoretically * the returned value of * Environment.getExternalStorageDirectory(), namely the * primary external storage. It can be the storage of internal * device, or that of external sdcard. If paths.size() >1, * basically, the current device contains two type of storage: * one is the storage of the device itself, one is that of * external sdcard. Additionally, the paths is directory. * @return List<String> * @throws IOException */ public static List<String> getExtSDCardPaths() { List<String> paths = new ArrayList<String>(); String extFileStatus = Environment.getExternalStorageState(); File extFile = Environment.getExternalStorageDirectory(); if (extFileStatus.equals(Environment.MEDIA_MOUNTED) && extFile.exists() && extFile.isDirectory() && extFile.canWrite()) { paths.add(extFile.getAbsolutePath()); } try { // obtain executed result of command line code of 'mount', to judge // whether tfCard exists by the result Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("mount"); InputStream is = process.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line = null; int mountPathIndex = 1; while ((line = br.readLine()) != null) { // format of sdcard file system: vfat/fuse if ((!line.contains("fat") && !line.contains("fuse") && !line .contains("storage")) || line.contains("secure") || line.contains("asec") || line.contains("firmware") || line.contains("shell") || line.contains("obb") || line.contains("legacy") || line.contains("data")) { continue; } String[] parts = line.split(" "); int length = parts.length; if (mountPathIndex >= length) { continue; } String mountPath = parts[mountPathIndex]; if (!mountPath.contains("/") || mountPath.contains("data") || mountPath.contains("Data")) { continue; } File mountRoot = new File(mountPath); if (!mountRoot.exists() || !mountRoot.isDirectory() || !mountRoot.canWrite()) { continue; } boolean equalsToPrimarySD = mountPath.equals(extFile .getAbsolutePath()); if (equalsToPrimarySD) { continue; } paths.add(mountPath); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return paths; } }
View Code
首先,我把它写成了一个工具类,因而声明了一个私有的构造器,目的就是要防止该类被实例化。
然后,首先获取了Android标准一部分的外置SD卡,如果它可用的话。
然后利用运行时,通过命令行函数"mount"来获取所有的存储位置,并对返回的结果进行SD卡或者TF卡的查找。
最后返回了所有可用于存储的不同的卡的位置,用一个List来保存。由于不是所有的手机都支持TF卡,因而这个List包含的路径未必很多,只有一个SD卡的手机只会返回一个路径,多个可用存储位置的会返回多个路径。
但有一点,是必须的,paths.get(0)肯定是外置SD卡的位置,因为它是primary external storage.
这是一篇有关Android存储的文章,推荐给大家,有兴趣的可以查看一下:Android存储的概念辨析及使用说明
相关文章推荐
- Android手机外置SD卡(TF卡)的获取方法
- Android中获取内置SD卡和外置SD卡路径的方法
- Android学习之获取外置SD卡读写路径方法详解
- Android获取内置和外置sd卡路径的方法
- Android 最新获取手机内置存储大小,SD卡存储空间大小方法
- Android获取不同手机 自身存储和外置SD卡存储路径的解决方案
- Android开发之获取SD卡及手机ROM容量的方法
- Android 6.0获取外置SD卡路径方法
- Android判断是否存在外置SD卡(获取手机所有存储设备的路径)
- Android N获取外置SD卡或挂载U盘路径的方法
- Android获取拓展外置SD卡(可插拔)路径及读写外置SD卡的方法
- Android 内部存储(外置SD卡)和扩展存储卡(TF卡)路径的获取
- Android获取机身存储、内置SD卡与外置TF卡路径
- 关于酷派8730“移动版”手机无法将应用安装在外置SD卡的解决办法和获取ROOT权限方法
- android 手机获取外置SD卡路径
- Android中获取网络图片的方法(如果手机缓存里面有就从缓存获取)
- 获取Android手机中SD卡内存信息
- Android 通用获取Ip的方法(判断手机是否联网的方法)!!!
- Android高手进阶教程(十一)之----Android 通用获取Ip的方法(判断手机是否联网的方法)!
- android 获取手机中所有的传感器Sensor类使用方法