Android编程实现手机自带内部存储路径的获取方法

作者:Cundong 时间:2022-05-14 11:59:11 

本文实例讲述了Android编程实现手机自带内部存储路径的获取方法。分享给大家供大家参考,具体如下:

我有一台中兴的Android手机,型号是 ZTE U930HD,手机没有插入外置SD卡(也就是Micro SD Card,原名Trans-flash Card(TF卡),2004年正式更名为Micro SD Card),但是机身自带了一个内置存储卡(也就是eMMC存储,大小为2G)。

我把这个手机用数据线插到电脑上,也会看到盘符,通过安装「R.E 管理器」等文件管理应用,也可以管理文件,并且能看到该存储的挂载目录是:/mnt/sdcard2

但是,我打印 Environment.getExternalStorageState(),却返回 "removed";

这是怎么回事?明明手机本身带着内置SD卡,却为何提示这么一个信息?

我又试着去打印了Environment.getExternalStorageDirectory(),返回:"/mnt/sdcard"

看起来可以解释了,在我这个中兴手机上,调用Environment.getExternalStorageDirectory(),返回的存储目录并不是系统内置的SD卡目录。

我又换了一个 Sony L39u,一个 MOTO G,调用Environment.getExternalStorageDirectory()返回的目录就是系统内置的SD卡目录。

不同的设备上,调用getExternalStorageDirectory()返回值却不一样。查询了Android的文档,才找到原因,原来这个方法返回的是当前设备厂商所认为的"外部存储",有可能返回外置的SD卡目录(Micro SD Card),也可能返回内置的存储目(eMMC)。

总结一下:

一部分手机将eMMC存储挂载到 /mnt/external_sd 、/mnt/sdcard2 等节点,而将外置的SD卡挂载到 Environment.getExternalStorageDirectory()这个结点。
此时,调用Environment.getExternalStorageDirectory(),则返回外置的SD的路径。

而另一部分手机直接将eMMC存储挂载在Environment.getExternalStorageDirectory()这个节点,而将真正的外置SD卡挂载到/mnt/external_sd、/mnt/sdcard2 等节点。
此时,调用Environment.getExternalStorageDirectory(),则返回内置的SD的路径。

至此就能解释为都是无外置SD卡的情况下,在中兴手机上,调用

打印 Environment.getExternalStorageState(),却返回 "removed",在索尼、MOTO G上就返回:"mounted"

原因已经知道了,可是如何在无外置SD卡的时候,获取到这个内置eMMC存储的具体路径呢?

比如,我这个中兴手机,既然使用 Environment.getExternalStorageDirectory() 获取到的是外置SD卡路径,但是我又没有插入SD卡,这个时候我想使用内置的eMMC存储来存储一些程序中用到的数据,我怎么去获取这个eMMC存储的路径呢?

答案是:通过扫描系统文件"system/etc/vold.fstab"来实现。

"system/etc/vold.fstab" 只是一个简单的配置文件,它描述了Android的挂载点信息。
我们可以遍历这个文件来获取所有的挂载点:


/**
* 遍历 "system/etc/vold.fstab" 文件,获取全部的Android的挂载点信息
*
* @return
*/
private static ArrayList<String> getDevMountList() {
 String[] toSearch = FileUtils.readFile("/etc/vold.fstab").split(" ");
 ArrayList<String> out = new ArrayList<String>();
 for (int i = 0; i < toSearch.length; i++) {
  if (toSearch[i].contains("dev_mount")) {
   if (new File(toSearch[i + 2]).exists()) {
    out.add(toSearch[i + 2]);
   }
  }
 }
 return out;
}

之后,当 Environment.getExternalStorageState()返回"removed"的时候(即,当没有挂载外置SD卡的时候),通过getDevMountList()方法获取一个list,这个list中可以进行写操作的那个就是系统自带的eMMC存储目录了。

判断逻辑:


/**
* 获取扩展SD卡存储目录
*
* 如果有外接的SD卡,并且已挂载,则返回这个外置SD卡目录
* 否则:返回内置SD卡目录
*
* @return
*/
public static String getExternalSdCardPath() {
 if (SDCardUtils.isMounted()) {
  File sdCardFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
  return sdCardFile.getAbsolutePath();
 }
 String path = null;
 File sdCardFile = null;
 ArrayList<String> devMountList = getDevMountList();
 for (String devMount : devMountList) {
  File file = new File(devMount);
  if (file.isDirectory() && file.canWrite()) {
   path = file.getAbsolutePath();
   String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmmss").format(new Date());
   File testWritable = new File(path, "test_" + timeStamp);
   if (testWritable.mkdirs()) {
    testWritable.delete();
   } else {
    path = null;
   }
  }
 }
 if (path != null) {
  sdCardFile = new File(path);
  return sdCardFile.getAbsolutePath();
 }
 return null;
}

希望本文所述对大家Android程序设计有所帮助。

标签:Android,路径
0
投稿

猜你喜欢

  • 浅谈C# 抽象类与开闭原则

    2023-11-07 11:00:08
  • Java序列化和反序列化示例介绍

    2023-11-25 04:24:26
  • C#常用目录文件操作类实例

    2023-06-24 13:30:24
  • Java jpa外连接查询join案例详解

    2022-12-17 18:31:15
  • asp.net之生成验证码的方法集锦(一)

    2022-09-07 22:37:13
  • Java事务管理学习之Spring和Hibernate详解

    2023-04-11 00:01:25
  • 妙解Java中的回调机制(CallBack)

    2022-07-15 15:25:31
  • C#微信开发(服务器配置)

    2023-07-18 17:42:01
  • Android使用CrashHandler来获取应用的crash信息的方法

    2023-07-25 20:27:38
  • Spring @Transaction 注解执行事务的流程

    2022-12-30 15:41:23
  • Java实现简单QQ聊天工具

    2023-11-25 05:54:52
  • 微信小程序微信登录的实现方法详解(JAVA后台)

    2023-08-29 12:37:25
  • Android中AlertDilog显示简单和复杂列表的方法

    2022-11-22 16:32:35
  • Spring事务失效的场景梳理总结

    2023-02-23 16:23:24
  • Java设计模式初识之备忘录模式详解

    2023-08-29 23:27:09
  • Android重力传感器实现滚动的弹球

    2023-05-04 05:49:28
  • Java基于Tcp协议的socket编程实例

    2022-03-08 00:04:13
  • C#实现读取匿名对象属性值的方法示例总结

    2023-02-02 18:56:03
  • Spring中自动装配的4种方式

    2021-08-01 16:44:41
  • SpringBoot动态Feign服务调用详解

    2022-05-20 13:26:23
  • asp之家 软件编程 m.aspxhome.com