2013-03-29 57 views
33

この行を:メッセージは「2ozjfFQzwvは」私はとして渡されたものです/2ozjfFQzwv: open failed: EROFS (Read-only file system)ものとFileNotFoundExceptionは、Androidでファイルを作成しようとしてい:オープンに失敗しました:EROFS(読み取り専用ファイルシステム)

final FileOutputStream outputStream = new FileOutputStream(name); 

結果ファイルの名前

私はWRITE_INTERNAL_STORAGEの許可の有無にかかわらずこれを試しました。このファイルを作成するにはどうしたらいいですか?

また、新しいアクティビティに画像を渡したいだけで、大きすぎて追加でシリアライズすることができません。それをファイルに書き込んだり、再度読み込んだりするのが簡単な方法はありますか?ここにあるすべての質問は、SDカードに書き込むことにあるようです。私はSDカードスロットを持たない人が多いため、やりたくないのです。

答えて

65

私はWRITE_INTERNAL_STORAGE権限の有無にかかわらずこれを試しました。

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

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

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

Fileオブジェクトを取るFileOutputStreamコンストラクタのバージョンを使用してください。あなたのような、に書き込むことができ、いくつかの場所のオフに基づいて、そのFileオブジェクトを作成します。

  • getFilesDir()
  • getExternalFilesDir()(あなたActivityまたは他のContextに呼ばれる)
(あなた Activityまたは他の Contextに呼ばれます)

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

ファイルに書き込んだ後でもう一度読み込むより簡単な方法はありますか?

一時的に静的データメンバーに入れることができます。

多くの人々がSDカードスロット

を持っていないので、 "SDカードスロット" には、無関係なことで、大規模です。 Android搭載機器のユーザーの99%が外部ストレージを使用します。ただし、ユーザーがSDカードを取り外した4歳以上のデバイスは例外です。 2010年半ば以降に製造されたデバイスには、リムーバブルメディアとしてではなく、オンボードフラッシュの一部としての外部ストレージがあります。

+5

+1()は、 '新しいBufferedWriterの(新しいてFileWriter(getFilesDir()+ FILENAME)) ありがとう;' –

+0

古いデバイスを? Nexus 7 2013を使用したことから学んだ限り、SDカードはサポートされていません... Nexus 10、おそらく他のNexiでも同様です。 – PawelP

+12

@PawełParadowski:すべてのNexusシリーズデバイスには外部ストレージがあります。彼らはリムーバブルストレージを持っていません。外部ストレージはリムーバブルストレージを意味しません。 – CommonsWare

3

ここにはandroid developerの簡単なサンプルがあります。

基本的に、あなたはこのような内部ストレージ内のファイルの書き込みができます。他の人が述べたように、Android上のアプリは、任意のフォルダにファイル内部ストレージが、自分のプライベートストレージを書き込むことはできません

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

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

を(/ data/data/PACKAGE_NAMEの下にあります)。

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

read this

13

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

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

をマーティンと同じように、マニフェストで

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

を追加し、使用して適切なフォルダ

+0

'APIレベル19から、getExternalFilesDir(String)およびgetExternalCacheDir()によって返されるアプリケーション固有のディレクトリ内のファイルを読み書きするために、このアクセス権は必要ありません。 'https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE – user3175580

5

で私のファイルを配置します:

これは私のためによく働く

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

出来た。

+3

dev.androidから:あなたのアプリがWRITE_EXTERNAL_STORAGE権限を使用している場合は、暗黙的に外部ストレージを読み取る権限も持ちます。 – IlyaEremin

+0

@ilyaEremin - 十分に真実 – Martin

0

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

:getFilesDirため

Android - How to use new Storage Access Framework to copy files to external sd card

関連する問題