Android手機內建內部儲存路徑的擷取

來源:互聯網
上載者:User

標籤:

轉自:http://my.oschina.net/liucundong/blog/288183

 

我有一台中興的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的掛載點資訊。
我們可以遍曆這個檔案來擷取所有的掛載點:

?
1234567891011121314151617     /**     * 遍曆 "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中可以進行寫操作的那個就是系統內建的eMMC儲存目錄了。

判斷邏輯:

?
123456789101112131415161718192021222324252627282930313233343536373839404142434445     /**     * 擷取擴充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;    }


參考:
[1] http://hubingforever.blog.163.com/blog/static/17104057920129198236599/
[2] http://stackoverflow.com/questions/5694933/find-an-external-sd-card-location
[3] http://developer.android.com/about/versions/android-3.0.html

Android手機內建內部儲存路徑的擷取 (轉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.