简体   繁体   中英

MediaStore Audio Column DATA Is Deprecated

Hello guys i am trying to get the absolute path of audio file in android api level 29 ie, Q but the problem is that DATA is deprecated so how to resolve this problem and also using the absolute path (ex: storage/sdcard/music.mp3) we can get the embedded picture to that audio but in content uri ( content:// ) that we can get using the _ID Column by appending the id of the file.But if we are not able to to get the absolute path then how to play an audio file using content:// Uri ? The previous codes that i am using is:

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;
    }

You won't be able to get the absolute path now but you can get content uri and using that content uri means ( content:// ) and use it to write file in your cache directory of your package folder using the below code:

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

And then use InputStream and OutputStream to store it in cache directory and use this filePath to as a File.

Use this line in application in the Manifest file

 android:requestLegacyExternalStorage="true" 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM