【问题标题】:Editing music title not working in Android Q?编辑音乐标题在 Android Q 中不起作用?
【发布时间】:2019-09-12 10:39:24
【问题描述】:

几天前 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 中工作。

【问题讨论】:

    标签: android editor android-10.0


    【解决方案1】:

    首先要了解为什么要使用 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 中仅适用于单个请求,因此一次只有 1 个文件,并且仅在下一个 Android 版本(假定为 R)中,才允许批量编辑/删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-12
      • 2018-07-05
      • 2021-02-07
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      相关资源
      最近更新 更多