android - API 29 媒体存储访问

标签 android mediastore android-10.0

我的应用程序在 Android 媒体存储中创建播放列表。对于 api 来说一切都很好,包括 28,但是 api 29 似乎需要额外的权限。 插入新的播放列表名称和 ID 没有问题。当插入轨道id和播放顺序时,会抛出访问权限异常。 在验证Uri时,我发现当resolver.insert for API 29时,异常错误是:

java.lang.SecurityException: myapp_name has no access to content://media/external_primary/audio/media/146

代码:

Uri exturi = MediaStore.Audio.Playlists.Members.getContentUri("external", playlist_id);
// exturi : content://media/external/audio/playlists/227/members

// values : audio_id=146 play_order=0
values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, play_order);
values.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, audio_id);

try {
    resolver.insert(exturi, values);
} catch (Exception e) {
    e.printStackTrace();
}

奇怪的是,虽然将新的播放列表插入 Mediastore 可以工作,但添加轨道(track_id、播放顺序)会出现访问权限错误

如何解决 API 29 的此异常错误?

2021 年 2 月更新: 向前迈出了一小步,我很确定我需要获取原始 uri 的 Documenturi,但仍然给出访问错误。所以问题不在于访问轨道,而在于 uri 本身。

doc_uri = MediaStore.getDocumentUri(context,playlist_members_uri);
java.lang.SecurityException: com.flyingdutchman.newplaylistmanager has no access to content://media/external/audio/playlists/130/members

最佳答案

我认为这是一个 Android 10 错误,所以我在这里提交了报告:https://issuetracker.google.com/issues/147619577 (如果您感兴趣的话,包括模拟器测试用例的说明以重现它)。请考虑为其加注星标,让 Android 团队知道它会影响您。

据我所知,它只影响“外部”存储上的文件,例如安装在 /storage/XXXX-XXXX 上的 SD 卡

与此同时,我的一些用户能够成功应用的唯一修复是将他们的音乐文件移动到内部存储(重新启动并等待媒体扫描完成,以确保 MediaStore 是最新的-日期)。

关于android - API 29 媒体存储访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57398381/

相关文章:

java - Android Studio 在重新启动时显示错误

java - Eclipse 中的 Android 源构建失败 - 帐户无法解析为类型

android - 空指针异常 "void android.media.MediaPlayer.setDataSource(android.content.Context, android.net.Uri)"

android - 在 Android 1.5 + 上访问视频和照片

Android - 检测用户的操作系统主题是深色还是浅色?

android - 如何将现有数据库从一个应用程序复制到另一个应用程序

android - 无法删除使用 MediaStore 插入的图像

Android 10 BLE 连接问题

java - 如何使用 Android Studio 列出 android 10 目录中的所有文件?

java - 如何使用动态模型类中的模型值来改造请求?