web-dev-qa-db-ja.com

Environment.getExternalStorageDirectory()。getAbsolutePath()は別のパスを提供します-Android

私は私の電話のメモリに何かを書き込もうとします。

最初に、パスを次のようにハードコーディングしました。

_myFile = new File("/sdcard/" + txtName.getText() + ".txt");
_

これはまったく問題ありません。

そして、Eclipseは私にそのようなパスをハードコーディングするべきではないという警告を私に与えます、代わりに私は次のことをすべきです:

_myFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/"+ txtName.getText() + ".txt");
_

次に、修正提案に従って警告を回避します。

しかし、ライタークラスでランタイム例外が発生しました。

次に、デバッグ用にEnvironment.getExternalStorageDirectory().getAbsolutePath()を出力します。結果は

/ storage/sdcard0

。しかし、以前に完全に正常に機能したハードコードされたものは実際には

/SDカード

なぜこれが起こるのですか?

警告を回避したい場合は、パスをハードコーディングする代わりに、「正式で正しい」方法でパスディレクトリを取得するにはどうすればよいですか?

PS:私の電話はHTC One Xで、外部SDカードスロットがありません。 32GBのストレージにはSDカードが内蔵されていると思いますので、本質は同じであるはずです。

11
Sibbs Gambling

なぜこれが起こるのでしょうか?

外部ストレージへのパスは何年にもわたって変化しているため、そもそもパスをハードコード化してはならないはずです。

パスをハードコーディングする代わりに、より「形式的で正しい」方法でパスディレクトリを取得するにはどうすればよいですか?

Environment.getExternalStorageDirectory()を使用します。

テスト環境では、/sdcard/storage/sdcard0へのシンボリックリンクまたはハードリンクであり、デバイスの製造元によって設定されています。ただし、allデバイスにそのような/sdcardシンボリックリンクがあることは保証されません。

32GBのストレージにはSDカードが内蔵されていると思います

外部ストレージは、オンボードの32GBフラッシュメモリの一部です。

15
CommonsWare

.getAbsolutePath()を削除すれば問題ありません。 Environment.getExternalStoreDirectory()は、製造元が外部ストレージを設定した場所へのパスを提供します。

0
3rdeye7