欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-04 10:29:52
本文实例讲述了android编程实现手机自带内部存储路径的获取方法。分享给大家供大家参考,具体如下: 我有一台中兴的android手机,型号是 zte u930hd,手机...

本文实例讲述了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程序设计有所帮助。