华为手机文件在内部存储路径_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?getDevMountList()?{
String[]?toSearch?=?FileUtils.readFile("/etc/vold.fstab").split("?");
ArrayList?out?=?new?ArrayList();
for?(int?i?=?0;?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?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手机自带内部存储路径的获取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python mysql 优化_Pyth
- 下一篇: Android 创建随机数生成器