Android編程實(shí)現(xiàn)手機(jī)自帶內(nèi)部存儲(chǔ)路徑的獲取方法
本文實(shí)例講述了Android編程實(shí)現(xiàn)手機(jī)自帶內(nèi)部存儲(chǔ)路徑的獲取方法。分享給大家供大家參考,具體如下:
我有一臺(tái)中興的Android手機(jī),型號(hào)是 ZTE U930HD,手機(jī)沒有插入外置SD卡(也就是Micro SD Card,原名Trans-flash Card(TF卡),2004年正式更名為Micro SD Card),但是機(jī)身自帶了一個(gè)內(nèi)置存儲(chǔ)卡(也就是eMMC存儲(chǔ),大小為2G)。
我把這個(gè)手機(jī)用數(shù)據(jù)線插到電腦上,也會(huì)看到盤符,通過安裝「R.E 管理器」等文件管理應(yīng)用,也可以管理文件,并且能看到該存儲(chǔ)的掛載目錄是:/mnt/sdcard2
但是,我打印 Environment.getExternalStorageState(),卻返回 "removed";
這是怎么回事?明明手機(jī)本身帶著內(nèi)置SD卡,卻為何提示這么一個(gè)信息?
我又試著去打印了Environment.getExternalStorageDirectory(),返回:"/mnt/sdcard"
看起來可以解釋了,在我這個(gè)中興手機(jī)上,調(diào)用Environment.getExternalStorageDirectory(),返回的存儲(chǔ)目錄并不是系統(tǒng)內(nèi)置的SD卡目錄。
我又換了一個(gè) Sony L39u,一個(gè) MOTO G,調(diào)用Environment.getExternalStorageDirectory()返回的目錄就是系統(tǒng)內(nèi)置的SD卡目錄。
不同的設(shè)備上,調(diào)用getExternalStorageDirectory()返回值卻不一樣。查詢了Android的文檔,才找到原因,原來這個(gè)方法返回的是當(dāng)前設(shè)備廠商所認(rèn)為的"外部存儲(chǔ)",有可能返回外置的SD卡目錄(Micro SD Card),也可能返回內(nèi)置的存儲(chǔ)目(eMMC)。
總結(jié)一下:
一部分手機(jī)將eMMC存儲(chǔ)掛載到 /mnt/external_sd 、/mnt/sdcard2 等節(jié)點(diǎn),而將外置的SD卡掛載到 Environment.getExternalStorageDirectory()這個(gè)結(jié)點(diǎn)。
此時(shí),調(diào)用Environment.getExternalStorageDirectory(),則返回外置的SD的路徑。
而另一部分手機(jī)直接將eMMC存儲(chǔ)掛載在Environment.getExternalStorageDirectory()這個(gè)節(jié)點(diǎn),而將真正的外置SD卡掛載到/mnt/external_sd、/mnt/sdcard2 等節(jié)點(diǎn)。
此時(shí),調(diào)用Environment.getExternalStorageDirectory(),則返回內(nèi)置的SD的路徑。
至此就能解釋為都是無(wú)外置SD卡的情況下,在中興手機(jī)上,調(diào)用
打印 Environment.getExternalStorageState(),卻返回 "removed",在索尼、MOTO G上就返回:"mounted"
原因已經(jīng)知道了,可是如何在無(wú)外置SD卡的時(shí)候,獲取到這個(gè)內(nèi)置eMMC存儲(chǔ)的具體路徑呢?
比如,我這個(gè)中興手機(jī),既然使用 Environment.getExternalStorageDirectory() 獲取到的是外置SD卡路徑,但是我又沒有插入SD卡,這個(gè)時(shí)候我想使用內(nèi)置的eMMC存儲(chǔ)來存儲(chǔ)一些程序中用到的數(shù)據(jù),我怎么去獲取這個(gè)eMMC存儲(chǔ)的路徑呢?
答案是:通過掃描系統(tǒng)文件"system/etc/vold.fstab"來實(shí)現(xiàn)。
"system/etc/vold.fstab" 只是一個(gè)簡(jiǎn)單的配置文件,它描述了Android的掛載點(diǎn)信息。
我們可以遍歷這個(gè)文件來獲取所有的掛載點(diǎn):
/**
* 遍歷 "system/etc/vold.fstab" 文件,獲取全部的Android的掛載點(diǎn)信息
*
* @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;
}
之后,當(dāng) Environment.getExternalStorageState()返回"removed"的時(shí)候(即,當(dāng)沒有掛載外置SD卡的時(shí)候),通過getDevMountList()方法獲取一個(gè)list,這個(gè)list中可以進(jìn)行寫操作的那個(gè)就是系統(tǒng)自帶的eMMC存儲(chǔ)目錄了。
判斷邏輯:
/**
* 獲取擴(kuò)展SD卡存儲(chǔ)目錄
*
* 如果有外接的SD卡,并且已掛載,則返回這個(gè)外置SD卡目錄
* 否則:返回內(nèi)置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;
}
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android應(yīng)用開發(fā)SharedPreferences存儲(chǔ)數(shù)據(jù)的使用方法
- android中使用SharedPreferences進(jìn)行數(shù)據(jù)存儲(chǔ)的操作方法
- Android調(diào)用相機(jī)并將照片存儲(chǔ)到sd卡上實(shí)現(xiàn)方法
- Android開發(fā)筆記之: 數(shù)據(jù)存儲(chǔ)方式詳解
- Android APP與媒體存儲(chǔ)服務(wù)的交互
- Android App將數(shù)據(jù)寫入內(nèi)部存儲(chǔ)和外部存儲(chǔ)的示例
- Android 數(shù)據(jù)存儲(chǔ)方式有哪幾種
- 在android開發(fā)中進(jìn)行數(shù)據(jù)存儲(chǔ)與訪問的多種方式介紹
- Android編程中的5種數(shù)據(jù)存儲(chǔ)方式
- Android學(xué)習(xí)之SharedPerference存儲(chǔ)詳解
相關(guān)文章
Android模擬器實(shí)現(xiàn)手機(jī)添加文件到sd卡的方法
這篇文章主要介紹了Android模擬器實(shí)現(xiàn)手機(jī)添加文件到sd卡的方法,詳細(xì)分析了Android模擬器添加文件到sd卡的步驟與相關(guān)技巧,需要的朋友可以參考下2016-06-06
Android仿騰訊QQ實(shí)現(xiàn)滑動(dòng)刪除 附源碼下載
仿騰訊QQ滑動(dòng)刪除操作,這篇文章主要為大家詳細(xì)介紹了ListView滑動(dòng)刪除的具體操作方法,感興趣的小伙伴們可以參考一下2016-07-07
Android開發(fā)教程之調(diào)用攝像頭功能的方法詳解
這篇文章主要介紹了Android調(diào)用攝像頭功能的方法,詳細(xì)分析了Android調(diào)用攝像頭功能的權(quán)限設(shè)置、功能代碼與實(shí)現(xiàn)步驟,需要的朋友可以參考下2016-06-06
Android利用zxing快速集成二維碼掃描的實(shí)例教程
最近二維碼真是越來越火了,隨便電視上、網(wǎng)絡(luò)上、商場(chǎng)里,到處都是二維碼,所以下面這篇文章我們就來給大家介紹關(guān)于Android利用zxing快速集成二維碼掃描的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起看看吧。2017-09-09
android實(shí)現(xiàn)raw文件夾導(dǎo)入數(shù)據(jù)庫(kù)代碼
這篇文章主要介紹了android實(shí)現(xiàn)raw文件夾導(dǎo)入數(shù)據(jù)庫(kù)代碼,有需要的朋友可以參考一下2013-12-12
android基于ListView和CheckBox實(shí)現(xiàn)多選和全選記錄的功能
本篇文章主要介紹了android基于ListView和CheckBox實(shí)現(xiàn)多選和全選記錄的功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-11-11
Android實(shí)現(xiàn)跳動(dòng)的小球加載動(dòng)畫效果
Android中有各式各樣的加載動(dòng)畫,大家多多少少都見過,比如用過美團(tuán)客戶端的用戶對(duì)美團(tuán)那個(gè)加載小人的動(dòng)畫印象很深刻,一個(gè)可愛的小人在那拼命的跑。這樣的動(dòng)畫實(shí)現(xiàn)其實(shí)還有很多,今天這里就來實(shí)現(xiàn)一個(gè)跳動(dòng)的小球效果。有需要的可以參考借鑒。2016-08-08
Android多線程斷點(diǎn)續(xù)傳下載功能實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android多線程斷點(diǎn)續(xù)傳下載功能的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03

