我使用以下Java代码从带有api27的Android Studio仿真器中查询音频文件。不幸的是,此代码不适用于api 29。
String[] projection = {
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.DURATION,
MediaStore.Audio.Media.TITLE,
MediaStore.Images.Media.DATA,
MediaStore.Audio.Media.TRACK,
MediaStore.Audio.Media.YEAR
};
uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Log.i(TAG, "Querying media...");
Log.i(TAG, "URI: " + uri.toString());
// Perform a query on the content resolver. The URI we're passing specifies that we
// want to query for all audio media on external storage (e.g. SD card)
Cursor cur = getContentResolver().query(uri, null,
MediaStore.Audio.Media.IS_MUSIC + " = 1", null, null);
Log.i(TAG, "Query finished. " + (cur == null ? "Returned NULL." : "Returned a cursor."));
Manifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="28"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28"/>
我在文档中找不到任何有关MediaStore查询的api28和api29之间发生了什么变化的提示。
请帮忙,谢谢GGK
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
碰巧遇到这个问题,思考半天尝试搞定的。 1、23以上动态权限,不光Manifest里面声明,用到时候也要声明。 2、模拟器的问题,既然数据由内容组件提供,当你多媒体文件添加到外部存储后,它并没有立即更新。。。大坑,,你restart模拟器下,发现cursor有数据了。。。它只在开机的时候检测外部磁盘文件。
android:maxSdkVersion="28"从您的 元素中删除。READ_EXTERNAL_STORAGE如果MediaStore要从非您自己的应用程序中查询内容,则需要-包括运行时权限。
您可以MediaStore不进行查询READ_EXTERNAL_STORAGE,但只会返回您自己插入的项目MediaStore。
有关更多信息,请参见此博客文章。