java - MediaStore 音频列数据已弃用

标签 java android android-studio audio mediastore

大家好,我想在 android api level 29 即 Q 中获取音频文件的绝对路径,但问题是 DATA 已被 弃用 那么如何解决这个问题并使用 绝对路径(例如:storage/sdcard/music.mp3) 我们可以将嵌入的图片获取到该音频但在内容 uri 中( content://),我们可以通过附加文件的 id 使用 _ID 列。但是如果我们无法获得绝对路径,那么如何播放音频文件使用 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://) 并使用它在您的缓存目录中写入文件使用以下代码打开您的包文件夹:

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

然后使用 InputStream 和 OutputStream 将其存储在缓存目录中,并将此文件路径用作文件。

关于java - MediaStore 音频列数据已弃用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62307866/

相关文章:

java - 如何在Java中调用karaf控制台命令

android - 执行doInBackground()时出现java.lang.RuntimeException错误如何解决?

android - Google Developer Console 错误地认为我的应用不是为平板电脑设计的

Android Studio 不生成APK

java - run方法后执行代码?

java - 如何在centos中降级java版本?

java - 对 AES 密码版本感到困惑

android - 如何在 FrameLayout 中将图像设置在中心

android - 如何防止Android工具栏在键盘出现时向上移动

java - 在 Excel 工作表中写入内容