android 系統是開源的,於是各種產商各種瞎改android系統,工作了幾個月,我發現單單就android的內外儲存裝置的路徑我就不知道怎麼獲取了。上網查了幾種方案,自己試驗了下,感覺好迷茫啊。在這裡記錄下我試驗的幾種方案。
方案一:通過enviroment類獲取儲存裝置路徑
android的官方文件上說,採用enviroment.getexternalstoragedirectory()方法可以得到android裝置的外接儲存(即外插sdcard),如果android裝置有外插sdcard的話就返回外插sdcard的根目錄路徑,如果android裝置沒有外插sdcard的話就返回android裝置的內建sdcard的路徑。這套方案很快就被否決了,因為enviroment類的這個方法裡面的路徑也是寫死的,只有原生的android系統才使用這套方案,被更改過的anroid體統很多裝置的路徑都改了。
方案二:讀取system/etc/vold.fstab檔案的內容來獲取儲存裝置路徑
參考文件:
內建和外接sd卡的資訊存在system/etc/vold.fstab 裡面,我們可以從這裡獲得外接sd卡的路徑。經本人實驗,發現很多疑問。我的機子是三星i9300,我的機子沒有外插sdcard。通過eclipse獲取vold.fstab檔案,開啟來看,有用的內容如下:
dev_mount sdcard /storage/extsdcard auto /devices/platform/s3c-sdhci.2/mmc_host/mmc1/
dev_mount sda /storage/usbdrivea auto /devices/platform/s5p-ehci
dev_mount sdb /storage/usbdriveb auto /devices/platform/s5p-ehci
dev_mount sdc /storage/usbdrivec auto /devices/platform/s5p-ehci
dev_mount sdd /storage/usbdrived auto /devices/platform/s5p-ehci
dev_mount sde /storage/usbdrivee auto /devices/platform/s5p-ehci
dev_mount sdf /storage/usbdrivef auto /devices/platform/s5p-ehci
這裡可沒有我的內建sdcard的路徑啊,不懂。開啟手機的檔案系統發現我的內建的sdcard路徑是:/storage/emulated/0。於是我到eclipse的ddms中去看下我的手機檔案系統,發現storage路徑下的檔案結構為:
從這個檔案結構可以看出,真正有內容的應該是emulated/legacy和sdcard0才對,再從後面的連線來看,最後這兩個目錄都應該是指向/mnt/shell/emulated/0。接著開啟/mnt/shell/emulated/0來看看,果然是我的sdcard目錄
這讓我很疑惑,這樣的話,讀取vold.fstab檔案來獲取sdcard目錄不就得不到/mnt/shell/emulated/0目錄了麼。方案二失敗。
方案三:方案三的原理是linux命令,在命令視窗中輸入 mount 或者 cat /proc/mounts 可得到系統掛載的儲存。你也可以在dos視窗中輸入 adb shell -> mount ,或者 adb shell -> cat /proc/mounts 來檢視( 」->「 符號只是乙個分割符,不要輸)。好,我來dos視窗中輸入adb shell -> mount 來看下會得到什麼
這個我也看不懂,不過我猜最後一條應該是我的sdcard的掛載了,因為有/mnt/shell/emulated 掛載路勁出現, 而/data/media是掛載的裝置麼?這是什麼東西?好,我借部手機來看看,看其他的手機會mount出什麼東西來。 那就借部note3來吧
我借來的這部手機有外插sdcard。可以看到最後兩條應該是掛載sdcard資訊了。不過它的掛載裝置是/dev/fuse, 和 /dev/block/vold/179:17 。 好吧,我暈了,等等,會不會 最後兩條資訊才是掛載sdcard資訊呢?我的是手機因為沒有外插sdcard,所以最後一條才是掛載sdcard資訊,有外插sdcard的,最後兩條是掛載sdcard資訊。這是規律?好吧,不是規律,我又借了部手機,mount了下,發現這個猜想純屬扯淡。
利用mount命令來獲取sdcard路徑的方法,
參考: 和
方案四:
android常見的sd卡儲存位置
/storage/emulated/0/
/storage/extsdcard
/mnt/external_sd/
/mnt/sdcard2/
/mnt/sdcard/external_sd/
/mnt/sdcard-ext/
/mnt/sdcard/
/storage/sdcard0/
/mnt/extsdcard/
/mnt/extsd/
/mnt/emmc/
/mnt/extern_sd/
/mnt/ext_sd/
/mnt/ext_card/
/mnt/_externalsd/
/sdcard2/
/sdcard/
/sdcard/sd/
/sdcard/external_sd/
/mnt/sd/
/mnt/
/storage/
/mnt/sdcard/sd/
/mnt/exsdcard/
/mnt/sdcard/extstorages/sdcard/
/ext_card/
/storage/extsdcard
3.0以上可以通過反射獲取:
1
storagemanager sm = (storagemanager) context.getsystemservice(context.storage_service);
2
// 獲取sdcard的路徑:外接和內建
3
string paths = (string) sm.getclass().getmethod(
"getvolumepaths"
,
null
).invoke(sm,
null
);
android 4.1上
1
storagemanager sm = (storagemanager) context.getsystemservice(context.storage_service);
2
string volumepaths = sm.getgetvolumepaths();
可以獲得所有mount的sd卡,難道我要一條一條路徑去遍歷?就算遍歷到了,我也不知道哪條是內建儲存,哪條是外接儲存。而且以後哪個深井冰產商又整出一條路徑出來,不就沒完沒了了嘛。
我現在很鬱悶,到底怎麼弄才有一套最佳方案?跪求大神解救我。
/**一定記得在manifest.xml中加權* 獲取外接sd卡路徑
* * @return
*/public static listgetsdcardpaths()
// 檢查命令是否執行失敗。
if (p.waitfor() != 0 && p.exitvalue() == 1)
}inbr.close();
in.close();
} catch (exception e)
optimize(sdcardpaths);
for (iterator iterator = sdcardpaths.iterator(); iterator.hasnext();)
return sdcardpaths;
} private static void optimize(listsdcaredpaths)
int index = 0;
while (true)
}return;
}string containsitem = sdcaredpaths.get(index);
for (int i = index + 1; i < sdcaredpaths.size(); i++)
}index++;
} }
android 獲取外部儲存裝置路徑
通常的獲取sdcard的路徑,我們會用environment.getexternalstoragedirectory 但是當我們的裝置有多個外部儲存裝置,environment就顯得捉襟見肘了。那麼有什麼方法可以解決這種問題?看下面的方法,通過反射的方式獲取外部儲存裝置的路徑,完美解決 nice。p...
Android獲得內 外接儲存卡路徑
我們知道android上一般都有外接的儲存卡,但是通過environment.getexternalstoragedirectory 獲取的是內建的儲存卡位置 也有的手機可以在系統中修改預設儲存 那麼如何獲取外接儲存卡的位置呢?我們可以通過storagemanager來獲取多個外接sdcard,如下...
android 獲取usb 裝置資訊
1.使用者需要獲取usb 裝置名,來判斷是不是我方的印表機 2.public string getproductname catch exception e logger.i manufacturer manufacturer n logger.i product product n logger....