首页 > 解决方案 > 编辑音乐标题在 Android Q 中不起作用?

问题描述

几天前 android Q 发布了。我有歌曲编辑功能,用于编辑应用程序中的歌曲标题,该功能在 Android Q 下运行良好。但现在更新音乐的相同代码不起作用.....


ContentResolver resolver=getApplicationContext().getContentResolver();
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
mRowsUpdated = resolver.update(uri, mInserts, MediaStore.Audio.Media._ID + " LIKE \"" + audioId + "\"", null);

这个 mRowsUpdated 给出了零。当我在 Android QI 中搜索更新时,我得到了范围存储,但我不认为这是原因.....因为即使关闭它仍然无法在 android Q 中工作。

标签: androideditorandroid-10.0

解决方案


首先要了解为什么要使用 LIKE 条件?MediaStore ID 对于每条记录都是唯一的,因此您不应使用“Like”,而是:

resolver.update(uri, mInserts, MediaStore.Audio.Media._ID + "=" + audioId, null);

关于Scoped Storage,您的应用只能更新/删除它拥有的媒体,以便它创建。如果您希望整体媒体访问不受限制地更新/删除其他应用程序创建的媒体,那么您需要通过ACTION_OPEN_DOCUMENT_TREE向用户请求此类权限,并使用 SAF (DocumentFile) API。

也就是说,在 Android Q 中,MediaStore 有一个新列MediaStore.MediaColumns.OWNER_PACKAGE_NAME,它定义了谁拥有(创建)此类媒体,这是允许在不需要任何权限的情况下操作文件的人。您不能更新此类列值,只有操作系统可以更改它。但是过滤掉您或其他应用程序创建文件的时间并向用户显示消息可能很有用。还要考虑如果您的应用程序被卸载并重新安装,该字段将被清除,因此您实际上失去了对您创建的任何内容的所有权。

您在更新调用中更新 0 条记录的原因是因为您使用的是复合查询(“LIKE \”“+ audioId +“\””)。但是,如果您在没有任何条件的情况下定位/更新单个 Uri,例如:

// mediaUri is the actual file Uri, so in the MediaStore format: content://media/external/audio/media/<the media id>
resolver.update(mediaUri, mInserts, null, null);

然后,当尝试使用非拥有文件进行操作时,您会得到一个RecoverableSecurityException,您将使用它来获取系统弹出窗口以请求用户的媒体权限。这有一个缺点,在 Android Q 中只适用于单个请求,因此一次只有一个文件,并且只有在下一个 Android 版本(假定为 R)中,才允许批量编辑/删除。


推荐阅读