android 獲取 內外儲存裝置路徑疑問

2021-09-01 21:24:50 字數 4480 閱讀 5488

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以上可以通過反射獲取:

1storagemanager sm = (storagemanager) context.getsystemservice(context.storage_service);

2// 獲取sdcard的路徑:外接和內建

3string paths = (string) sm.getclass().getmethod("getvolumepaths",null).invoke(sm,null);

android 4.1上

1storagemanager sm = (storagemanager) context.getsystemservice(context.storage_service);

2string volumepaths = sm.getgetvolumepaths();

可以獲得所有mount的sd卡,難道我要一條一條路徑去遍歷?就算遍歷到了,我也不知道哪條是內建儲存,哪條是外接儲存。而且以後哪個深井冰產商又整出一條路徑出來,不就沒完沒了了嘛。

我現在很鬱悶,到底怎麼弄才有一套最佳方案?跪求大神解救我。

/**

* 獲取外接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++;

} }

一定記得在manifest.xml中加權

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....