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
相关产品推荐
相关产品推荐

