You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android媒体播放器应用错误:无法实例化MediaStore.Audio对象

解决Android媒体播放器中MediaStore.Audio实例化错误的方案

嘿,我一眼就看出问题所在了——你试图直接实例化MediaStore.Audio来存储音频信息,但MediaStore.Audio根本不是用来干这个的!它只是Android系统提供的一个常量容器类,用来封装媒体存储相关的URI、列名等静态字段,并没有接受字符串参数的构造方法,这就是错误的根源。

解决步骤

1. 自定义音频数据模型类

首先你需要创建一个自己的实体类,用来存储从媒体库查询到的音频信息,比如命名为AudioModel:

public class AudioModel {
    // 存储音频的路径、标题、专辑、艺术家信息
    private String data;
    private String title;
    private String album;
    private String artist;

    // 带参数的构造方法
    public AudioModel(String data, String title, String album, String artist) {
        this.data = data;
        this.title = title;
        this.album = album;
        this.artist = artist;
    }

    // 按需添加Getter方法,方便后续获取数据
    public String getData() {
        return data;
    }

    public String getTitle() {
        return title;
    }

    public String getAlbum() {
        return album;
    }

    public String getArtist() {
        return artist;
    }
}

2. 修改loadAudio()方法

把原来的MediaStore.Audio实例化替换成自定义的AudioModel,同时优化Cursor的资源管理(避免空指针和资源泄漏):

private void loadAudio() {
    ContentResolver contentResolver = getContentResolver();
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
    String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";

    // 使用try-with-resources自动关闭Cursor,无需手动调用close()
    try (Cursor cursor = contentResolver.query(uri, null, selection, null, sortOrder)) {
        if (cursor != null && cursor.getCount() > 0) {
            audioList = new ArrayList<>();
            while (cursor.moveToNext()) {
                // 声明局部变量,避免作用域混乱
                String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
                String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
                String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
                String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));

                // 添加自定义的AudioModel实例到列表
                audioList.add(new AudioModel(data, title, album, artist));
            }
        }
    } catch (Exception e) {
        // 捕获异常并打印,方便排查问题
        e.printStackTrace();
    }
}

额外优化点

  • 原来的代码中如果cursor为null,调用cursor.close()会触发空指针异常,用try-with-resources可以完美解决这个问题,它会自动在代码块结束时关闭Cursor。
  • 把data、title等变量声明为循环内的局部变量,避免因变量作用域过大导致的潜在问题。

内容的提问来源于stack exchange,提问作者Kjs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:37:40