web-dev-qa-db-ja.com

getExternalCacheDir()は、データをクリアした後にnullを返します

データにアクセスして外部ストレージに書き込むシンプルなアプリがあります。 [設定]-> [アプリ]-> [アプリ情報]に移動し、[データを消去]ボタンでデータを消去するまで、すべて正常に機能します。その後、getExternalCacheDir()を呼び出すたびにnullが返され始めます。

Android 4.2.2を実行しているNexus7で開発しています。

私のマニフェストは次のようになります。

_<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.package"
    Android:versionCode="5"
    Android:versionName="1.3"
    xmlns:tools="http://schemas.Android.com/tools">

<uses-sdk
    Android:minSdkVersion="8"
    Android:targetSdkVersion="17" />

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

<application
...
_

動作しないコードスニペット:

_    Log.d(TAG, "getExternalStorageState() = " + Environment.getExternalStorageState());
    Log.d(TAG, "getExternalCacheDir() = " + c.getExternalCacheDir());
    Log.d(TAG, "getExternalFilesDir(null) = " + c.getExternalFilesDir(null));
    Log.d(TAG, "getExternalFilesDir(Environment.DIRECTORY_MOVIES) = " + c.getExternalFilesDir(Environment.DIRECTORY_MOVIES));
_

アプリをインストールして実行した後のLogCat:

_05-15 11:26:45.948: DEBUG/HelperUtils(5541): getExternalStorageState() = mounted
05-15 11:26:45.948: DEBUG/HelperUtils(5541): getExternalCacheDir() =     /storage/emulated/0/Android/data/com.example.package/cache
05-15 11:26:45.948: DEBUG/HelperUtils(5541): getExternalFilesDir(null) = /storage/emulated/0/Android/data/com.example.package/files
05-15 11:26:45.948: DEBUG/HelperUtils(5541): getExternalFilesDir(Environment.DIRECTORY_MOVIES) = /storage/emulated/0/Android/data/com.example.package/files/Movies
_

アプリ情報設定でデータをクリアした後のLogCat:

_05-15 11:27:57.848: DEBUG/HelperUtils(5859): getExternalStorageState() = mounted
05-15 11:27:57.848: WARN/ContextImpl(5859): Unable to create external cache directory
05-15 11:27:57.848: DEBUG/HelperUtils(5859): getExternalCacheDir() = null
05-15 11:27:57.848: WARN/ContextImpl(5859): Unable to create external files directory
05-15 11:27:57.848: DEBUG/HelperUtils(5859): getExternalFilesDir(null) = null
05-15 11:27:57.848: WARN/ContextImpl(5859): Unable to create external files directory
05-15 11:27:57.848: DEBUG/HelperUtils(5859): getExternalFilesDir(Environment.DIRECTORY_MOVIES) = null
05-15 11:27:57.848: WARN/ContextImpl(5859): Unable to create external cache directory
_

データをクリアしてアプリを実行した後、getExternalCacheDir()は「マウント済み」を返しますが、Environment.getExternalStorageState()メソッドはnullを返します。何が間違っている可能性があるか誰かが知っていますか?

[〜#〜]編集[〜#〜]

Gjordisの助けを借りて、Clear dataボタンがアプリケーションの一時ディレクトリ全体を削除することを発見しました。

_storage/sdcard0/Android/data/com.example.app/cache_ in _Android/data_

getExternalCacheDir()または手動で再度作成することはできませんでした(ただし、_storage/sdcard0/Android/data/_の下に他のディレクトリを作成することはできます)。

(_Android/data/com.example.app_はデバイスの再起動後に再度作成されますが、それは私が探している解決策ではありません)

19
Andy

私はこの正確な問題に遭遇し、解決しました。

[データの消去]ボタンをクリックすると、Androidアプリが停止しますが実行されなくなり、アプリケーション固有のフォルダー全体が削除されます_"mnt/sdcard/Android/data/your.package.name"_。

ただし、Runtime.getRuntime().exec()から開始された別のプロセスがまだ実行されていて、このフォルダーに書き込んでいました。これにより、フォルダーがロックされた状態でスタックし、アプリがgetExternalCacheDir()を呼び出したときに説明したのと同じ症状が発生しました。/mnt/sdcard/Android/dataフォルダー内から_adb Shell_を実行してからlsを実行すると、フォルダーがプロセスによってロックされていることがわかりました。 psを実行すると、他のプロセスがまだ実行中であることがわかりました。

解決策は、getExternalCacheDir()を呼び出す前に、アプリケーションのアプリケーション固有のフォルダーにまだ書き込んでいる他のプロセスを適切に強制終了することでした。

11
Robert

getExternalCacheDir()は、名前が示すようにキャッシュディレクトリを返します。キャッシュがない場合は、そのためのディレクトリもありません。このディレクトリは、removedataコマンドで削除した一時ファイルに使用されます。電話の容量が不足している場合は、これらのフォルダ自体も削除できます。少なくともいくつかのメンテナンスアプリケーションはそうします。

getExternalFilesDir()は、データを保存するためのスペースのディレクトリを返します。

6
Gjordis