web-dev-qa-db-ja.com

Androidで一時ファイルを作成する最良の方法は何ですか?

私はコードに実際に「行き詰まっている」わけではないので、これは正確には問題ではありませんが、外部ストレージとファイルへのアクセスに関してAndroid APIの奇妙な動作を見つけました.createTempFile()メソッド、そして何が起こっているのかを理解したい...

私のマニフェスト含まない<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE">が含まれていることに注意してください。


パート1:

私は次のコードを持っていますdoesチャームとして機能します:

File tempFile = new File(Environment.getExternalStorageDirectory(),
                      "my_temp_file.png");

一時ファイルを作成してくれるので、問題なくデータを書き込むことができます。

質問1:SDカードに書き込み権限がないのに、なぜ機能するのですか?


パート2:

一時ファイルを作成するための公式の方法であるcreateTempFileを使用するようにコードを変更しようとしました。だから私は試しました:

File tempFile = File.createTempFile("my_temp", "png", 
                      Environment.getExternalStorageDirectory());

そして、manifest.xmlにWRITE_EXTERNAL_STORAGEを追加しました。何だと思う ?これは機能せず、Java.io.IOExceptionを取得します:

09-07 14:07:29.061: E/_CLOG(19982): Java.io.IOException: Permission denied
09-07 14:07:29.061: E/_CLOG(19982):     at Java.io.File.createNewFileImpl(Native Method)
09-07 14:07:29.061: E/_CLOG(19982):     at Java.io.File.createNewFile(File.Java:1257)
09-07 14:07:29.061: E/_CLOG(19982):     at Java.io.File.createTempFile(File.Java:1322)
09-07 14:07:29.061: E/_CLOG(19982):     at com.(...).onClick(ProfileImageUpdater.Java:58)

質問2:なぜこれが機能しないのに、私見では機能するのでしょうか?

12
Orabîg

私はついに何が起こっているのかを理解しました...

質問1:実際、作成されたファイルは、システムアプリケーションがユーザーのギャラリーから画像を取得してトリミングするために使用することを目的としていました。そのため、ファイルはシステム自体によって書き込まれたため、私のアプリはWRITE_EXTERNAL_STORAGE権限を所有する必要はありませんでした。

質問2:わかりません。 Androidは、私が試みていた場所に一時ファイルを作成することを許可していないと思います(それは適切な場所ではないため)

0
Orabîg

このようにしてみてください...

File outputDir = context.getCacheDir(); // context being the Activity pointer
File outputFile = File.createTempFile("prefix", "extension", outputDir);

編集:

for質問2

以下のリンクのように問題になる可能性があります...

Environment.getExternalStorageDirectoryはリムーバブルストレージへのパスを返しません

14
Priyank Patel

このエラーが発生するのは、manifest.xmlで外部ストレージへの書き込み権限を宣言しているためです。この権限を追加する必要があります。

また、getExternalStorage()に直接ファイル(特に一時的なファイル)を書き込むことは決してありません。

これはSDカードに直接配置され、混乱を引き起こします。独自のアプリケーションでのみ表示される一時ファイルの場合は、次を使用する必要があります。

_getExternalStorage() + "/Android/data/<package_name>/cache/"
_

パッケージ化されたアプリに置き換えます。 com。 Orabig.myFirstAppは、ユーザーがアプリケーションをアンインストールすると、その特別なフォルダーがシステムから自動的に削除され、システムを一時ファイルから解放します。

編集:

私のマニフェストには含まれていないことに注意してください

必ず!

edit:また、一時メディアファイル(PNGなど)を作成する場合は、そのフォルダーに.nomediaという名前の空のファイルを作成することをお勧めします。そうすれば、メディアスキャナーがスキャンしてギャラリーに表示するのを避けることができます。

最終編集:

また、ファイルを作成する前に、Fileオブジェクトでmkdirs()を呼び出してフォルダーを作成する必要があります。

4
Budius