[英]MediaStore.Audio.Media.EXTERNAL_CONTENT_URI is deprecated for api 29+?
我正在開發一個離線音樂播放器應用程序。 為此,我使用 MediaStore.Audio.Media.DATA 和類似結構獲取音樂數據,並將它們列在回收站視圖中。 該代碼在 api 級別 29 之前工作正常,但在 api 29 及更高版本中無法正常工作。 在 Google MediStore 文檔頁面上,寫到 MediaStore 庫已從 api 29+ 及更高版本中棄用。 那么對於 29+ 之后運行的系統我應該怎么做呢? 我找不到它的源代碼或示例代碼。 如果我能解決這個問題,我也會分享我項目的 Github 鏈接。 我是一名初級開發人員,如果有人可以提供幫助或建議資源,我將非常高興。我編寫的方法在沒有 api 29 及之前版本的情況下有效;
public void loadData() {
ContentResolver contentResolver = requireContext().getContentResolver();
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
String sortOrder = TITLE + " ASC";
Cursor cursor = contentResolver.query(uri, null, selection, null, sortOrder);
if (cursor != null && cursor.getCount() > 0) {
model = new ArrayList<>();
while (cursor.moveToNext()) {
@SuppressLint("Range") String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));@SuppressLint("Range") String title = cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.TITLE));
@SuppressLint("Range") String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
@SuppressLint("Range") String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
@SuppressLint("Range") String duration = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
@SuppressLint("Range") String displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
@SuppressLint("Range") String volume = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.VOLUME_NAME));
@SuppressLint("Range") String bucketName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.BUCKET_DISPLAY_NAME));
// Save to audioList
int calculatedDuration = (Integer.valueOf(duration) / 60);
model.add(new MusicModel(data, title, album, artist));
Log.e("test",
"\n data = " + data +
"\n" + "title = " + title +
"\n" + "album = " + album +
"\n" + "artist = " + artist +
"\n" + "duration = " + calculatedDuration +
"\n" + "display name = " + displayName +
"\n" + "volume name = " + volume +
"\n" + "bucket name = " + bucketName);
}
}
cursor.close();
ArtistAdapter adapter = new ArtistAdapter(requireContext(), model);
binding.rvArtist.setAdapter(adapter);
binding.rvArtist.setHasFixedSize(true);
}
所以這段代碼在 api 29 之前都可以正常工作。但我不知道我可以在 29+ 及更高版本上使用的替代方案。 我應該怎么辦?
@blackapps我重新閱讀了MediaStore頁面,我認為我的代碼僅在我試圖以api級別閱讀的歌曲僅在內部存儲中時才有效。 當我將歌曲移動到模擬器(api 33,api 29)的內部存儲中時,代碼運行沒有任何問題。 當你說這個問題不是由我正在使用的庫引起時,我意識到,目前我的代碼在除 28 之外的所有 api 級別上都可以正常工作。我認為這是一個獨立於 MediaStore 庫的問題,但總的來說,我的問題是解決了。 非常感謝你,你的評論真的讓我意識到了這一點。 我在我的個人資料上分享了我的項目的 github 鏈接,但如果我犯了錯誤,我很抱歉,因為我是使用 android 工作室和 github 的新手。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.