AcroRabbit

今日皆を一番の笑顔にするブログ

Android端末内に画像を保存するときにはまったこと

皆さん自撮りの季節ですね!
今回はこの前自撮り編集アプリを作成してた時にはまってしまった所の備忘録になります。
メモ書きです。

端末内に画像を保存するにはBitmapクラスのBitmap.compressを使います。
コードで書くと大体こんな感じ

File dataDir;
dataDir = new File(Environment.getExternalStorageDirectory(), "sampleDir");
dataDir.mkdirs();
File filePath=new File(dataDir,fileName);
OutputStream os=new FileOutputStream(filePath);
originalBitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);

これで画像を保存できるのは良いのですが、さてじゃあ保存した画像を参照しようとして以下のような雰囲気で画像を取り出してみます。
今回はファイルを保存するときにあたまに test という文字から始まるファイル名にしていたので、そのようなファイルを探しています。

Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Cursor cursor = getContentResolver().query(uri, null, "_display_name LIKE ?" ,new String[] { "test%" } , "_ID DESC");
final ArrayList<CheckedImage> lstItem = new ArrayList<CheckedImage>();
cursor.moveToFirst();
for (int i = 0; i < cursor.getCount(); i++){
     long id = cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
     lstItem.add(new CheckedImage(false,id));
     cursor.moveToNext();
}

……取れない!試しに検索の条件を外して、SDカード内のすべての画像を表示してみたのですが、やっぱりない。
ついでに言うとNexus5に最初から入ってる、画像見るやつでも見れない!

MediaStore.Images.Media | Android Developers

The content:// style URI for the "primary" external storage volume.
"primary"という表現が気になりますが、これはどうやら持ってきた画像がSDカード内の画像である保証はないということらしいです。
でもあんまり今回は関係ない?

ここからが本題なのですが、結局ContentResolver#query()はAndroid内臓のDBからデータを読み込むので、今回保存した画像をDBに登録していなかったのが問題らしいです。
なので今回は画像を保存した直後に以下のコードを

ContentValues values = new ContentValues();
ContentResolver contentResolver = mContext.getContentResolver();
values.put(MediaStore.Images.Media.TITLE, fileName);
values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpeg");
values.put(MediaStore.Images.Media.DATA, Environment.getExternalStorageDirectory().toString() +"/" + "PixtureAlbum/"+fileName);
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Toast.makeText(getContext(), "Success", Toast.LENGTH_SHORT).show();

これで動きました!

新生活大変だと思いますが、皆様素敵な自撮りライフを送ってください―。