簡體   English   中英

api 29+ 已棄用 MediaStore.Audio.Media.EXTERNAL_CONTENT_URI?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM