12

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

私のマニフェストに<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">.


パート1 :

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

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

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

質問 1 : SDCard に書き込み権限がないはずなのに、なぜ機能するのですか?


パート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 :なぜこれが機能しないのですか?

4

3 に答える 3

14

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

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

編集 :

質問2の場合

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

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

于 2012-09-07T12:22:40.230 に答える
4

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

また、getExternalStorage()に直接ファイル(特に一時的なファイル)を書き込むことは絶対にしないでください。

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

getExternalStorage() + "/Android/data/<package_name>/cache/"

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

編集:

私のマニフェストには

必ず!

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

最後の編集:

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

于 2012-09-07T12:22:16.210 に答える
-1

やっと何が起きたのか分かった…

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

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

于 2012-09-12T09:32:43.377 に答える