web-dev-qa-db-ja.com

Androidで写真を保存する場所

私のアプリケーションは、インターネットからダウンロードされ、Android電話でローカルにキャッシュされている画像を大量に使用しています。これらの画像を保存する正しい方法は何でしょうか。いくつかの方法があります。見てください、それは完全に満足できるものではありません。

SDカードのパブリックフォルダに保存します

  • アンインストール時に解放されないスペースを使い果たす
  • ユーザーはギャラリーで写真を見ることができます
  • Sdcardルートにフォルダが必要です(実際に電話を閲覧しているときに確認できます)

SDカードの非公開フォルダーに保存します

  • アンインストール時に解放されないスペースを使い果たす
  • SDカードのスペースを密かに使用

アプリケーション内に保存します

  • アプリケーションのサイズが大幅に増大する

アプリケーションの画像をローカルに保存してユーザーの注意をそらさず、ゴミを残さないための正しい方法は何ですか?

33
Ulrich Scheller

あなたの最善の解決策は以下を使用することです:

context.getCacheDir()

このディレクトリはアプリケーション専用であり、アンインストール時に削除されます。さらに、デバイスのスペースが不足している場合、システムはこのディレクトリから削除できます。

ドキュメントが言うことに注意してください:

これらのファイルを削除するシステムに依存しないでください。キャッシュファイルで消費するスペースの量には、常に1 MBなどの適切な最大値を設定し、そのスペースを超えたときにそれらのファイルをプルーニングする必要があります。

多くのスペースが必要で、SDカードを使用したい場合は、

getExternalCacheDir()

代わりに。これらはアンインストール時にも削除されますが、システムは外部ストレージで利用可能なスペースを監視しないため、スペースが少ない場合にこれらのファイルを自動的に削除しません。このオプションを使用する場合は、外部ストレージが利用可能であることも確認する必要があります

Environment.getExternalStorageState()

書き込む前に。

31
Rupert Bates

/sdcard/.donotscan/のように 非表示のディレクトリに配置 (つまり、ドットを前に付けて)の場合、MediaScannerから画像を非表示にすることができます。

更新: Twitterでromainguyが言及 として、これは.nomediaという名前のファイルをディレクトリに置いた場合にも機能します。

11
rndstr

一番いい方法はデータベースを使うことだと思います。

  1. アプリケーションとメモリを破壊することはありません。
  2. アプリケーションがアンインストールされると、関連するデータベースが削除されます。
  3. アプリケーション以外では、誰もこのファイルにアクセスできません。

更新:しかし;データのみをキャッシュしたい場合は、webkitで定義されたキャッシュマネージャーがあります。 CacheManager

以前はパッケージを使用していませんでしたが、メソッドを使用するのは簡単なようです。

static boolean   cacheDisabled()
static boolean   endCacheTransaction()
static CacheManager.CacheResult  getCacheFile(String url, Map<String, String> headers)
static File  getCacheFileBaseDir()
static void  saveCacheFile(String url, CacheManager.CacheResult cacheRet)
static boolean   startCacheTransaction()

Google Gears code で使用法を見つけることができます

これがお役に立てば幸いです。

6
Ömer

CacheManagerを使用したくない場合は、データベースまたはローカル(SD以外)ファイル(ローカルファイルは完全なアンインストール時に削除されます)を使用して登録し、「ACTION_DEVICE_STORAGE_LOW」および「ACTION_DEVICE_STORAGE_OK」ブロードキャストアクションを受信します。次に、アプリケーションがデバイスに応じて領域を使いすぎている場合、および画像の削除を開始する必要がある場合を確認します。アプリケーションのサイズは引き続き増加しますが、増加と縮小を管理できます。

0
Will