0

一部のAndroidデバイスにマウントされた外部SDカードのパスを取得するというよく知られた問題に直面しています。(私が何を意味するかを理解するには、この質問を参照してください)

の内容を読んで、パーティションを表す行だけをとることで問題を解決しようと思っていました/etc/vold.fstabが、テストを行うためのデバイスがありません。私がやりたいのは、そのファイルを読み取り、によって返されたアドレスを参照する行を無視しEnvironment.getExternalStorageDirectory()、他の行(存在する場合)を取得することです。

私が知らないこと(そしてそれをテストする可能性がないこと)は次のとおりです:外部SDカードではない他の回線を持つことができる場合がありますか?SDカードが存在する場合、それはファイルvold.fstabに表示されますか?

編集:答えは:はい。受け入れられた答えを読んでください。

4

3 に答える 3

1

これの何が問題になっていますか?

Environment.getExternalStoreDirectory()

SDカードの場合、なぜこれを無視するのですか?

OK-/ sdcard(内部)と外部SDカード(??)を備えたデバイスの場合、いつでもfstabファイルをスキャンして、SDホストコントローラーブリッジドライバーである「sdhci」を探すことができます。

何かのようなもの:

dev_mount sdcard /mnt/external_sdcard auto /devices/platform/sdhci.2/mmc_host/mmc2

次に、必要に応じて解析します。

OSによって実際にそのように扱われていないのに、なぜ実際のSDカードを見つける「必要性」があるのでしょうか。(大容量記憶装置としてはマウントされません)

アプリケーションは、これが当てはまるデバイスでのみ利用できますか?AndroidがSDストレージスペースであると信じているものを使用することの何が問題になっていますか?

于 2012-11-20T15:35:26.577 に答える
0

次のコードを使用して、最初にsdCardが存在するかどうかを検出してから、関連するコードを実行します。

Detecting whether SD card exists:

Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
if(isSDPresent)
{
    // file path = "/mnt/sdcard/Android/data/PACKAGE_NAME/..."
}
else
{
    // file path = "/data/data/PACKAGE_NAME/..."
}

これがあなたが求めているものだと思いますか?

于 2012-11-20T16:04:45.420 に答える
-1

これは正しい解決策かもしれません。/etc/vold.fstabから読んでください。ここには、現在Linuxシステム(Androidを含む)にマウントされているすべてのパーティションが一覧表示されています。

String getExternalSdcardDirectory() {
    FileInputStream fis = null;
    try {
        fis = new FileInputStream(new File("/etc/vold.fstab"));
    } catch (FileNotFoundException e) {
        return null;    // should never be reached
    }

    try {
        byte[] buffer = new byte[4096];
        int n=0;

        String file = "";
        while ((n=fis.read(buffer, 0, 4096))>0) {
            file += new String(buffer, 0, n);
        }
        fis.close();

        String[] rows = file.split("\n");
        for (String row: rows) {
            String trimmedRow = row.trim();
            if (trimmedRow.startsWith("#") || trimmedRow.equals(""))
                continue;
            else if (trimmedRow.equals(Environment.getExternalStorageDirectory().getAbsolutePath()))
                continue;
            else
                return trimmedRow.split(" ")[2];

        }
    } catch (IOException e) {
        // nothing
    }
    return null;
}
于 2015-03-16T11:48:46.377 に答える