お絵かきアプリで書いた絵を保存する。で生成した画像のファイルですが、ファイル管理ツールなどで、保存が確認できるのですが、ギャラリーなどで、表示がされない。一度再起動などすると、確認が出来る。と言った現象が起こります。
今回はこの保存の問題に関して解決をしたいと思います。
では、
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()));
上記でメディアスキャンを呼び出してくれるようです。(すいません、この方法は未確認です。)
問題点:これだとメディアスキャンを全体に実行をするので、時間がかかるようです。
ContentValues values = new ContentValues(); ContentResolver contentResolver = getContentResolver(); values.put(Images.Media.MIME_TYPE, "image/jpeg"); values.put(Images.Media.LATITUDE, loc.getLatitude()); values.put(Images.Media.LONGITUDE, loc.getLongitude()); values.put(Images.Media.TITLE, fileName); // タイトル名(ファイル名にしてます) values.put("_data", filePath); // 画像の保存されたフルパス contentResolver.insert(Media.EXTERNAL_CONTENT_URI, values);
僕の作った方では【Media.EXTERNAL_CONTENT_URI】が正確に動作をしてくれなくて【MediaStore.Images.Media.EXTERNAL_CONTENT_URI】だと正確に認識してくれました。
参照:http://labs.techfirm.co.jp/android/cho/2118
この方法は、使っているfunctionの推定なんですが、アンドロイドアプリの画像管理などのデータベースに直接書き込んでいるような印象です。
でここまででかなりまとまっては来たのですが、上書きをした場合に、そのギャラリーなどの表示が更新されない。という、問題にぶち当たります。
insertだけでなく、contentResolver.delete,contentResolver.updateなどの関数を用いても更新はされません。
上書き処理を行うには、次の方法で現在のデータを一度消してから、insertをする必要があります。
File saveFile = new File(path); if(saveFile.exists()) { String[] proj = {MediaStore.Images.Media._ID,MediaStore.Images.Media.DATA}; Cursor cursor = activity.managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,proj,MediaStore.Images.Media.DATA + " = ?",new String[] { path },null); if(cursor.getCount() != 0) { cursor.moveToFirst(); Uri deleteUri = ContentUris.appendId( MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon(), cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media._ID))).build(); activity.getContentResolver().delete(delete, null, null); } }
以上で上書きの処理ができました。
ですが、ユーザーがこのアプリで上書きをする必要性がなければ、同じ名前を回避してあげる(アラートで他の名前に変えさせる・ランダムな名前)で解決をした方がよいような気がします。