この行:
final FileOutputStream outputStream = new FileOutputStream(name);
結果はFileNotFoundException
になり、メッセージは/2ozjfFQzwv: open failed: EROFS (Read-only file system)
になります。ここで、「2ozjfFQzwv」はファイル名として渡したものです。
私はこれをWRITE_INTERNAL_STORAGE
許可ありとなしで試しました。書き込み用にこのファイルを作成するにはどうすればよいですか?
または、新しいアクティビティに画像を提供できるようにしたいだけで、余分にシリアル化するには大きすぎます。ファイルに書き込んでから再度読み取るよりも簡単な方法はありますか?ここでの質問はすべて、SDカードへの書き込みに関するもののようです。多くの人はSDカードスロットを持っていないので、これはやりたくありません。
私はこれを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年半ば以降に製造されたデバイスには、リムーバブルメディアとしてではなく、オンボードフラッシュの一部として外部ストレージがあります。
wRITE_EXTERNAL_STORAGEの許可を使用してみてください。外部カードがあるかどうかにかかわらず、それを使用する必要があります。
これは私にとってうまくいきます:
path = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_MOVIES);
File file = new File(path, "/" + fname);
ファイルを適切なフォルダーに配置します
Android developer の簡単なサンプルを次に示します。
基本的に、次のように内部ストレージにファイルを書き込むことができます。
String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
追加中
<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);
動いた。
他の人が述べたように、Androidのアプリは、内部ストレージではなく、独自のプライベートストレージ(/ data/data/PACKAGE_NAMEの下にある)にファイルを書き込むことができません。
APIを使用して、アプリに許可されている正しいパスを取得する必要があります。
読み取り this 。
ユニット/インスツルメンテーションテストでこれを取得している場合は、テストコンテキストではなく、アプリコンテキストでgetFilesDir()
を呼び出してください。すなわち:
Context appContext = getInstrumentation().getTargetContext().getApplicationContext();
じゃない
Context appContext = InstrumentationRegistry.getContext;
Googleは外部SDカードへの書き込みアクセスを制限しています。 API 19からは、ストレージアクセスフレームワークと呼ばれるフレームワークがあり、書き込みアクセスを許可するための「契約」を設定できます。
詳細情報: