最终,花了一些时间,但我弄清楚了。
首先,您需要获取文件的访问权限。在这里可以阅读有关此内容的信息。
接下来,我发现要更新标题或艺术家字段(也许还包括其他字段,但我没有测试过),您需要将列MediaStore.Audio.Media.IS_PENDING
的值设置为1。像这样:
val id =
val values = ContentValues()
values.put(MediaStore.Audio.Media.IS_PENDING, 1)
val uri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id)
contentResolver.update(uri, values, null, null)
然后您可以编辑需要的字段。另外,为了结束更新过程,请再次将MediaStore.Audio.Media.IS_PENDING
设置为0:
val id =
val title =
val artist =
val values = ContentValues()
values.put(MediaStore.Audio.Media.IS_PENDING, 0)
values.put(MediaStore.Audio.Media.TITLE, title)
values.put(MediaStore.Audio.Media.ARTIST, artist)
val uri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id)
contentResolver.update(uri, values, null, null)
那么在一个函数中,它会像这样:
@RequiresApi(value = android.os.Build.VERSION_CODES.Q)
fun updateMetadata(contentResolver: ContentResolver, id: Long, title: String, artist: String) {
val uri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id)
val values = ContentValues()
values.put(MediaStore.Audio.Media.IS_PENDING, 1)
contentResolver.update(uri, values, null, null)
values.clear()
values.put(MediaStore.Audio.Media.IS_PENDING, 0)
values.put(MediaStore.Audio.Media.TITLE, title)
values.put(MediaStore.Audio.Media.ARTIST, artist)
contentResolver.update(uri, values, null, null)
}
虽然它是用Kotlin编写的,但我认为您会弄清楚如何在Java中实现。
更新
通过更新MediaStore
而不在任何Android版本上更新实际文件。这意味着,如果一个文件被更新(例如:重命名)和/或通过MediaScannerConnection
扫描,则您的更改将丢失。此答案是正确的。
compileSdkVersion
设置为29
或更高版本。 - CommonsWareDISPLAY_NAME
更改,则通过ContentResolver更新可能会触及Android Q中的实际文件。这被认为是一个位置更改列,不需要PENDING
状态。大多数列都需要PENDING
状态。请参见MediaProvider实现的sMutableColumns
以获取所有不需要PENDING
状态的列。 - CodeRed