2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?