外部SDカード(デバイスのフラッシュメモリの「外部」ではなく外部)で書き込み操作を実行するアプリケーションがありますが、ここで徹底的に議論されており、他のかなりの数の質問があるようです。さまざまなメーカーのすべての電話で機能するSDカードのマウントポイントを取得するための一般的な方法/サポートされているAPIはありません。
そのことを念頭に置いて、以下のコードのような何かを実行して、外部ストレージ デバイスがマウントされているかどうか、およびその場所を確認する必要があります。
final String state = Environment.getExternalStorageState();
if ( Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state) ) { // we can read the External Storage...
//Retrieve the primary External Storage:
final File primaryExternalStorage = Environment.getExternalStorageDirectory();
//Retrieve the External Storages' root directory:
final String externalStorageRootDir;
if ( (externalStorageRootDir = primaryExternalStorage.getParent()) == null ) { // no parent...
Log.i("SD Card Path", "External Storage: " + primaryExternalStorage + "\n");
}
else {
final File externalStorageRoot = new File( externalStorageRootDir );
final File[] files = externalStorageRoot.listFiles();
for ( final File file : files ) {
if ( file.isDirectory() && file.canRead() && (file.listFiles().length > 0) ) { // it is a real directory (not a USB drive)...
Log.i("SD Card Path", "External Storage: " + file.getAbsolutePath() + "\n");
}
}
}
}
私は間違っている可能性がありますが、SD カードが完全に空であり、最後の状態(file.listFiles().length > 0)
が返される可能性があることは理解していfalse
ます。だから私はそれをチェックする代わりにlength
、私は追加すると思っfile.canWrite()
た. それは、現在テストしている電話で期待どおりに機能しました(Motorola Atrix MB860-古いことはわかっていますが、私の要件の1つは、Gingerbread、API 9以降のバージョンと互換性を持たせることです)が、かどうかはわかりませんその条件は、両方とも読み取り可能なディレクトリであるため、最近のまたはそうでない他の電話にtrueを返す/mnt/asec/
か/mnt/obb
、最初の2つの条件も満たす可能性があります(また、何かが書き込まれている場合(50MB以上のサイズのファイルのように)に戻るtrue
ことさえあります)。(file.listFiles().length > 0)
/mnt/obb
要するに、私が知る必要があるのは、アプリがこれら 2 つの場所への書き込み許可を持っているのか、それともシステムだけがそのような許可を持っているのかということです。はいの場合、取得したい最終パスからそれらを除外するために他に何を確認できますか: デバイスにインストールされている外部 SD カード?
助けてくれてありがとう!