ContentResolverでSDカードに画像保存
AndroidはOSもマーケットもオープンなので、将来的には他者に負けまいと各メーカー独自のAPIが用意され、マーケット側でも差別化のために独自のAPIが整備され、選択肢が増える反面、一括で対応するのはほぼ不可能になり、市場は細切れになっていくんだろうなぁという気がしているdaichi1128です。
さて、今回はAndroidのデータベースアクセスの肝になるContentResolverを使ったSDカードへの画像保存をやってみます。
目標はギャラリーに表示させるところまで。
カメラ画像として保存する
Androidのギャラリーアプリ内でカメラフォルダの中に画像を保存する方法です。
早速コードから。
createNameメソッドはAndroidのカメラアプリのソースがこうしていたので、なんとなく合わせてみました。
カメラアプリのソースはこちら
MediaStoreクラスはAndroidでストレージで扱うデータのメタデータを持つクラスです。今回は画像の保存なので、MediaStore.Images.Mediaクラスを使います。
MediaStore.Images.MediaのInsertImageメソッドは、画像を保存し、サムネイル画像も同時に保存してくれます。
このメソッドで保存すると、ギャラリーのカメラフォルダに画像が表示されます。
別フォルダとして保存する
カメラフォルダでない自分で用意したフォルダ内に保存する場合はこんな具合に書いてみました。
これもAndroidのカメラアプリを参考にしています。
一旦ファイルとして画像データをSDカードに書き込んでから、ContentResolverでは画像データではなく、ファイルパスを書き込みます。
Environment.getExternalStorageDirectory()からデバイスの外部ストレージへのパスがとれるので、そこにアプリ名としてここでは”PATOM”を付けて、/外部ストレージ/PATOM/の中に画像を保存するようにしてます。
ファイルの書き込み時にBitmapデータが引数に渡された場合、jpegの圧縮してから保存。
jpgeのバイト配列の場合、そのまま書き込み。
この時、AndroidManifest.xmlにパーミッションを設定しないとファイルが存在しませんエラーになるので、以下を追記します。
これで2時間くらいハマリました。(エラーに権限ありませんて出して欲しい。。。)
ContentResolverでAndroidのデータベースに保存する場合、ContentValuesクラスを使います。
key-value形式でデータベースのカラム名をキーに、値をputします。
どのカラムが存在するかは、対象となるURIごとに異なるため、APIを確認してください。
ここでは外部ストレージへの画像データベースを表すMediaStore.Images.Media.EXTERNAL_CONTENT_URIへ保存しにいくため、
MediaStore.MediaColumnsで定義されているカラムを指定しています。
これでギャラリーにこんな感じでPATOMフォルダとして画像が表示されます。

Nexus Oneでしか確認できてませんが、きっと他のバージョンのOSでもできると信じています。

