ContentResolverのinsertがnullになる
そのファイルが存在しているのにinsertをかけようとすると返り値がnullになります。
val values = ContentValues().apply{
put(MediaStore.Images.Media.DISPLAY_NAME, "hoge.jpg")
put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/fuga")
put(MediaStore.Images.Media.MIME_TYPE, "image/jpg")
}
val uri = contentResolver.insert(
MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY),
values
)
Log.d("log",uri.toString())
---
2020-09-19 22:23:48.688 29801-29801/com.example.sample D/log: content://media/external_primary/images/media/7173
2020-09-19 22:23:50.858 29801-29801/com.example.sample D/log: null
idを取得してupdateする
insertしてnullだった場合、そのファイルを検索してidを取得し、そこからUriを作成してupdateなりdeleteなりよしなにすればOKです。
- query
- Uri.withAppendedPath
- update
contentResolver.query(
MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY),
null,
"${MediaStore.Images.Media.DISPLAY_NAME}=?",
arrayOf("hoge.jpg"),
null)?.use{
if(it.moveToNext()){
val id = it.getColumnIndexOrThrow(BaseColumns._ID)
val uri = Uri.withAppendedPath(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
id.toString()
)
}
}
実ファイルが存在しないのにinsertがnullになる場合
なんらかの契機でたまに発生します。MediaStoreのdeleteではなく、ファイルマネージャ等から削除するとか・・・?
MediaStoreのDBにおそらくレコードが残ってしまっていて、実際の状態と不整合を起こしています。
AndroidはMediaScannerがなんらかのタイミングで走り、保存されたファイルをMediaStoreのDBに登録しています。(=フォトから見れるようになる)
なので、こうなってしまった場合は端末を再起動するか、しばらく時間を置くと自然と治っている事が多いです。