国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android編程實現(xiàn)手機自帶內部存儲路徑的獲取方法

2020-04-11 11:17:32
字體:
來源:轉載
供稿:網友

本文實例講述了Android編程實現(xiàn)手機自帶內部存儲路徑的獲取方法。分享給大家供大家參考,具體如下:

我有一臺中興的Android手機,型號是 ZTE U930HD,手機沒有插入外置SD卡(也就是Micro SD Card,原名Trans-flash Card(TF卡),2004年正式更名為Micro SD Card),但是機身自帶了一個內置存儲卡(也就是eMMC存儲,大小為2G)。

我把這個手機用數(shù)據(jù)線插到電腦上,也會看到盤符,通過安裝「R.E 管理器」等文件管理應用,也可以管理文件,并且能看到該存儲的掛載目錄是:/mnt/sdcard2

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

這是怎么回事?明明手機本身帶著內置SD卡,卻為何提示這么一個信息?

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

看起來可以解釋了,在我這個中興手機上,調用Environment.getExternalStorageDirectory(),返回的存儲目錄并不是系統(tǒng)內置的SD卡目錄。

我又換了一個 Sony L39u,一個 MOTO G,調用Environment.getExternalStorageDirectory()返回的目錄就是系統(tǒng)內置的SD卡目錄。

不同的設備上,調用getExternalStorageDirectory()返回值卻不一樣。查詢了Android的文檔,才找到原因,原來這個方法返回的是當前設備廠商所認為的"外部存儲",有可能返回外置的SD卡目錄(Micro SD Card),也可能返回內置的存儲目(eMMC)。

總結一下:

一部分手機將eMMC存儲掛載到 /mnt/external_sd 、/mnt/sdcard2 等節(jié)點,而將外置的SD卡掛載到 Environment.getExternalStorageDirectory()這個結點。
此時,調用Environment.getExternalStorageDirectory(),則返回外置的SD的路徑。

而另一部分手機直接將eMMC存儲掛載在Environment.getExternalStorageDirectory()這個節(jié)點,而將真正的外置SD卡掛載到/mnt/external_sd、/mnt/sdcard2 等節(jié)點。
此時,調用Environment.getExternalStorageDirectory(),則返回內置的SD的路徑。

至此就能解釋為都是無外置SD卡的情況下,在中興手機上,調用

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

原因已經知道了,可是如何在無外置SD卡的時候,獲取到這個內置eMMC存儲的具體路徑呢?

比如,我這個中興手機,既然使用 Environment.getExternalStorageDirectory() 獲取到的是外置SD卡路徑,但是我又沒有插入SD卡,這個時候我想使用內置的eMMC存儲來存儲一些程序中用到的數(shù)據(jù),我怎么去獲取這個eMMC存儲的路徑呢?

答案是:通過掃描系統(tǒng)文件"system/etc/vold.fstab"來實現(xiàn)。

"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中可以進行寫操作的那個就是系統(tǒng)自帶的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程序設計有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 苍南县| 休宁县| 惠东县| 佛学| 凌源市| 张家口市| 玛多县| 区。| 海林市| 宜州市| 黄龙县| 漯河市| 上栗县| 江西省| 施甸县| 重庆市| 灵山县| 商水县| 浏阳市| 洞口县| 舒兰市| 阿勒泰市| 类乌齐县| 中江县| 溧水县| 玉龙| 志丹县| 舟山市| 长治县| 喜德县| 高唐县| 张家川| 茌平县| 肇庆市| 兰坪| 奇台县| 台南县| 岳普湖县| 北辰区| 泊头市| 邮箱|