簡體   English   中英

MediaStore 音頻列 DATA 已棄用

[英]MediaStore Audio Column DATA Is Deprecated

大家好,我正在嘗試獲取 android api level 29 ie, Q但問題是DATA 已被deprecated ,因此如何解決此問題並使用absolute path (ex: storage/sdcard/music.mp3)我們可以將嵌入的圖片獲取到該音頻,但在內容 uri( content:// )中,我們可以通過附加文件的 id 使用_ID Column來獲取它。但是如果我們無法獲得絕對路徑,那么如何使用content:// Uri播放音頻文件? 我使用的以前的代碼是:

public ArrayList<Song> FolderFilesList(Context context, String FolderPath) {
      //folder-exclude-sub-folders

        ArrayList<Song> songs = new ArrayList<>();

  String[] columns = {
            MediaStore.Audio.Media._ID,
            MediaStore.Audio.Media.TITLE,
            MediaStore.Audio.Media.ARTIST,
            MediaStore.Audio.Media.DURATION,
            MediaStore.Audio.Media.DATA,
            MediaStore.Audio.Media.ALBUM,
            MediaStore.Audio.Media.ALBUM_ID,
            MediaStore.Audio.Media.TRACK,
            MediaStore.Audio.Media.ARTIST_ID,
            MediaStore.Audio.Media.DISPLAY_NAME,

    };


        String selection = MediaStore.Audio.Media.DATA + " LIKE ?      AND " + MediaStore.Audio.Media.DATA + " NOT LIKE ? ";
        String[] selectionArgs = new String[]{
                "%" + FolderPath + "%",
                "%" + FolderPath + "/%/%"
        };

        Cursor cursor =  context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                columns(), selection, selectionArgs, null);
        if (cursor.moveToFirst()) {
            do {
                Song song = new Song(
                         cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID)),
                        cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)),
                        cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)),
                        cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)),
                        cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)),
                        cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST_ID)),
                        cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)),
                        cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.TRACK)),
                        cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION))
                );

                //File f = new File(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)));
                // if (f.isFile() && f.exists()) {
                songs.add(song);
                //}
            } while (cursor.moveToNext());
        }
        if (cursor != null) {
            cursor.close();
        }
        return songs;
    }

您現在將無法獲得絕對路徑,但您可以獲取內容 uri 並使用該內容 uri 表示 ( content:// ) 並使用它使用以下代碼將文件寫入 package 文件夾的緩存目錄中:

String filePath = new File(resolver.openFileDescriptor(contentUri, "r");

然后使用 InputStream 和 OutputStream 將其存儲在緩存目錄中,並將此 filePath 用作文件。

在 Manifest 文件的應用程序中使用此行

 android:requestLegacyExternalStorage="true" 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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