web-dev-qa-db-ja.com

Androidでファイルを作成しよう:オープンに失敗しました:EROFS(読み取り専用ファイルシステム)

この行:

final FileOutputStream outputStream = new FileOutputStream(name);

結果はFileNotFoundExceptionになり、メッセージは/2ozjfFQzwv: open failed: EROFS (Read-only file system)になります。ここで、「2ozjfFQzwv」はファイル名として渡したものです。

私はこれをWRITE_INTERNAL_STORAGE許可ありとなしで試しました。書き込み用にこのファイルを作成するにはどうすればよいですか?

または、新しいアクティビティに画像を提供できるようにしたいだけで、余分にシリアル化するには大きすぎます。ファイルに書き込んでから再度読み取るよりも簡単な方法はありますか?ここでの質問はすべて、SDカードへの書き込みに関するもののようです。多くの人はSDカードスロットを持っていないので、これはやりたくありません。

54
Drew

私はこれをWRITE_INTERNAL_STORAGE許可の有無にかかわらず試してみました。

AndroidにはWRITE_INTERNAL_STORAGE権限がありません。

書き込み用にこのファイルを作成するにはどうすればよいですか?

アプリがスーパーユーザー権限で実行されている場合、おそらくルート化されたデバイスを除き、そうしません。アプリがアクセスできない内部ストレージのルートに書き込もうとしています。

FileOutputStreamオブジェクトを受け取るFileコンストラクターのバージョンを使用してください。次のような、書き込み可能な場所に基づいてFileオブジェクトを作成します。

  • getFilesDir()Activityまたは他のContextで呼び出されます)
  • getExternalFilesDir()Activityまたは他のContextで呼び出されます)

後者には、許可としてWRITE_EXTERNAL_STORAGEが必要です。

ファイルに書き込んでから再度読み取るよりも簡単な方法はありますか?

一時的に静的データメンバーに配置できます。

多くの人がSDカードスロットを持っていないため

「SDカードスロット」は、概して無関係です。 Androidデバイスユーザーの99%に外部ストレージがあります。例外は、ユーザーがSDカードを取り外した4歳以上のデバイスです。 2010年半ば以降に製造されたデバイスには、リムーバブルメディアとしてではなく、オンボードフラッシュの一部として外部ストレージがあります。

84
CommonsWare

wRITE_EXTERNAL_STORAGEの許可を使用してみてください。外部カードがあるかどうかにかかわらず、それを使用する必要があります。

これは私にとってうまくいきます:

path = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_MOVIES);
File file = new File(path, "/" + fname);

ファイルを適切なフォルダーに配置します

17
Martin

Android developer の簡単なサンプルを次に示します。

基本的に、次のように内部ストレージにファイルを書き込むことができます。

String FILENAME = "hello_file";
String string = "hello world!";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
5
Xuan Wu

追加中

 <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />

マニフェストで、マーティンと同じものを使用しています:

path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); 
File file = new File(path, "/" + fname);

動いた。

5
nobjta_9x_tq

他の人が述べたように、Androidのアプリは、内部ストレージではなく、独自のプライベートストレージ(/ data/data/PACKAGE_NAMEの下にある)にファイルを書き込むことができません。

APIを使用して、アプリに許可されている正しいパスを取得する必要があります。

読み取り this

2

ユニット/インスツルメンテーションテストでこれを取得している場合は、テストコンテキストではなく、アプリコンテキストでgetFilesDir()を呼び出してください。すなわち:

Context appContext = getInstrumentation().getTargetContext().getApplicationContext();

じゃない

Context appContext = InstrumentationRegistry.getContext;
0
David Refaeli

Googleは外部SDカードへの書き込みアクセスを制限しています。 API 19からは、ストレージアクセスフレームワークと呼ばれるフレームワークがあり、書き込みアクセスを許可するための「契約」を設定できます。

詳細情報:

Android-新しいストレージアクセスフレームワークを使用して外部SDカードにファイルをコピーする方法

0
Theo