我使用以下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
从android:maxSdkVersion="28"
元素中删除<uses-permission>
。如果要查询READ_EXTERNAL_STORAGE
来获取非您自己的应用程序中的内容,则需要MediaStore
-包括运行时权限。
您可以查询没有MediaStore
的READ_EXTERNAL_STORAGE
,但是它只会返回您自己插入MediaStore
的项目。
请参阅this blog post以了解更多。