@ Комментарий CommonsWare помог.
Идея состоит в том, чтобы
- Запросить, если файл уже существует с resolver.query ()
- Если да, извлеките contentUri из курсора
- В противном случае используйте resolver.insert ()
. При создании выбора для запроса следует обратить внимание на то, что MediaStore.MediaColumns.RELATIVE_PATH требует завершения "/"
т.е. / OLArt / '<< note the sla sh после OLArt / </p>
val selection = "${MediaStore.MediaColumns.RELATIVE_PATH}='Pictures/OLArt/' AND "
+ "${MediaStore.MediaColumns.DISPLAY_NAME}='house2.jpg' "
Ниже приведены обновленные коды.
@RequiresApi(Build.VERSION_CODES.Q)
private fun getExistingImageUriOrNullQ(): Uri? {
val projection = arrayOf(
MediaStore.MediaColumns._ID,
MediaStore.MediaColumns.DISPLAY_NAME, // unused (for verification use only)
MediaStore.MediaColumns.RELATIVE_PATH, // unused (for verification use only)
MediaStore.MediaColumns.DATE_MODIFIED //used to set signature for Glide
)
// take note of the / after OLArt
val selection = "${MediaStore.MediaColumns.RELATIVE_PATH}='Pictures/OLArt/' AND "
+ "${MediaStore.MediaColumns.DISPLAY_NAME}='house2.jpg' "
contentResolver.query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection, selection, null, null ).use { c ->
if (c != null && c.count >= 1) {
print("has cursor result")
c.moveToFirst().let {
val id = c.getLong(c.getColumnIndexOrThrow(MediaStore.MediaColumns._ID) )
val displayName = c.getString(c.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME) )
val relativePath = c.getString(c.getColumnIndexOrThrow(MediaStore.MediaColumns.RELATIVE_PATH) )
lastModifiedDate = c.getLong(c.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_MODIFIED) )
imageUri = ContentUris.withAppendedId(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id)
print("image uri update $displayName $relativePath $imageUri ($lastModifiedDate)")
return imageUri
}
}
}
print("image not created yet")
return null
}
Затем я добавляю этот метод в мои существующие коды
@RequiresApi(Build.VERSION_CODES.Q)
private fun setImageUriQ(): Uri {
val resolver = contentResolver
imageUri = getExistingImageUriOrNullQ() //try to retrieve existing uri (if any)
if (imageUri == null) {
//=========================
// existing codes for resolver.insert
//(SNIPPED)
//=========================
}
return imageUri!!
}