几天后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 Q中搜索更新时,我得到的是范围存储,但我不认为这是原因.....因为即使将其关闭也无法在android Q中工作。
答案 0 :(得分:0)
第一件事是了解为什么使用LIKE条件? MediaStore ID对于每条记录都是唯一的,因此您不应使用“赞”,而是:
resolver.update(uri, mInserts, MediaStore.Audio.Media._ID + "=" + audioId, null);
关于作用域存储,您的应用仅可以更新/删除其拥有的媒体,从而可以创建自己的媒体。 如果您希望不受限制地进行整体媒体访问以更新/删除其他应用程序创建的媒体,则需要通过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仅适用于单个请求,因此一次只能提供1个文件,并且仅在下一个Android版本(据说是R)中,才允许批量编辑/删除。