LoginSignup
2
2

More than 3 years have passed since last update.

【Android】ContentResolverのinsertがnullになる場合

Posted at

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です。
1. query
2. Uri.withAppendedPath
3. 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に登録しています。(=フォトから見れるようになる)
なので、こうなってしまった場合は端末を再起動するか、しばらく時間を置くと自然と治っている事が多いです。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2