MediaPlayer error: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference
MediaPlayer error: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference
我正在尝试制作一个应用程序来播放 phone 内部存储器中的音乐文件。
这是第一种在ListView中列出所有歌曲的方法。
public void fileSearch() {
String[] loadSongs = {MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME};
Cursor audioCursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, loadSongs, null, null, null);
if (audioCursor != null) {
if (audioCursor.moveToFirst()) {
do {
int audioIndex = audioCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
audioList.add(audioCursor.getString(audioIndex));
} while (audioCursor.moveToNext());
}
}
audioCursor.close();
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, android.R.id.text1, audioList);
listSongs.setAdapter(adapter);
listSongs.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectedSong(position);
}
});
}
而这个方法应该是播放用户在上一个列表中选择的歌曲。
public void selectedSong(int position) {
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, android.R.id.text1, audioList);
Toast.makeText(MainActivity.this, "You have selected the song:" + adapter.getItem(position), Toast.LENGTH_SHORT).show();
File songSelectedPath = getFileStreamPath(adapter.getItem(position));
Uri uri = Uri.fromFile(songSelectedPath);
Log.d("Adapter", "AdapterToStringPath: " + uri);
Log.d("Pointer", "Pointer: " + position);
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer = MediaPlayer.create(this,uri);
mediaPlayer.start();
}
错误来自这一行 mediaPlayer = MediaPlayer.create(this,uri);
Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference
问题是您向 MediaPlayer 添加了无效路径。要获得正确的路径,您可以使用 Cursor 查找所选歌曲的名称并获取其路径。简而言之,我必须修改您的方法的签名,以便直接发送文件名而无需适配器再次传递这就是方法:
public void selectedSong(String songName) {
String[] loadSongs = {MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.DISPLAY_NAME};
String selection1 = MediaStore.Audio.Media.DISPLAY_NAME + " = ?";
String[] selectionArgs = new String[]{songName};
Cursor audioCursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, loadSongs, selection1, selectionArgs, null);
if (audioCursor != null) {
if (audioCursor.moveToFirst()) {
int audioIndex = audioCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
String path = audioCursor.getString(audioIndex);
Log.e("TAG", "selectedSong: " + path);
Uri uri = Uri.fromFile(new File(path));
Log.d("Adapter", "AdapterToStringPath: " + uri);
MediaPlayer mediaPlayer = new MediaPlayer();
Log.e("TAG", "selectedSong: " + uri);
mediaPlayer = MediaPlayer.create(this, uri);
mediaPlayer.start();
}
}
然后在您的听众中像下面这样称呼它:
listSongs.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectedSong(audioList.get(position));
}
});
我上面挂载的方法可能无法正常工作让我们假设我们在不同的 [=13 上有一个相同的 Name
的文件=] 在这种情况下,您很可能在文件上弄错了,因为我们将从它的 [= 中得到 file path
15=].
所以我建议您创建一个 Object
,其中包含 Filename
和 Path
并将其添加到 list of songs
,以显示您需要 Dispalyed_Name
的项目,当您点击一首歌曲时,您将获得 Path
我觉得比较容易做。如果您不明白我的建议,请不要犹豫发表评论
我正在尝试制作一个应用程序来播放 phone 内部存储器中的音乐文件。
这是第一种在ListView中列出所有歌曲的方法。
public void fileSearch() {
String[] loadSongs = {MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME};
Cursor audioCursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, loadSongs, null, null, null);
if (audioCursor != null) {
if (audioCursor.moveToFirst()) {
do {
int audioIndex = audioCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
audioList.add(audioCursor.getString(audioIndex));
} while (audioCursor.moveToNext());
}
}
audioCursor.close();
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, android.R.id.text1, audioList);
listSongs.setAdapter(adapter);
listSongs.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectedSong(position);
}
});
}
而这个方法应该是播放用户在上一个列表中选择的歌曲。
public void selectedSong(int position) {
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, android.R.id.text1, audioList);
Toast.makeText(MainActivity.this, "You have selected the song:" + adapter.getItem(position), Toast.LENGTH_SHORT).show();
File songSelectedPath = getFileStreamPath(adapter.getItem(position));
Uri uri = Uri.fromFile(songSelectedPath);
Log.d("Adapter", "AdapterToStringPath: " + uri);
Log.d("Pointer", "Pointer: " + position);
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer = MediaPlayer.create(this,uri);
mediaPlayer.start();
}
错误来自这一行 mediaPlayer = MediaPlayer.create(this,uri);
Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference
问题是您向 MediaPlayer 添加了无效路径。要获得正确的路径,您可以使用 Cursor 查找所选歌曲的名称并获取其路径。简而言之,我必须修改您的方法的签名,以便直接发送文件名而无需适配器再次传递这就是方法:
public void selectedSong(String songName) {
String[] loadSongs = {MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.DISPLAY_NAME};
String selection1 = MediaStore.Audio.Media.DISPLAY_NAME + " = ?";
String[] selectionArgs = new String[]{songName};
Cursor audioCursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, loadSongs, selection1, selectionArgs, null);
if (audioCursor != null) {
if (audioCursor.moveToFirst()) {
int audioIndex = audioCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
String path = audioCursor.getString(audioIndex);
Log.e("TAG", "selectedSong: " + path);
Uri uri = Uri.fromFile(new File(path));
Log.d("Adapter", "AdapterToStringPath: " + uri);
MediaPlayer mediaPlayer = new MediaPlayer();
Log.e("TAG", "selectedSong: " + uri);
mediaPlayer = MediaPlayer.create(this, uri);
mediaPlayer.start();
}
}
然后在您的听众中像下面这样称呼它:
listSongs.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectedSong(audioList.get(position));
}
});
我上面挂载的方法可能无法正常工作让我们假设我们在不同的 [=13 上有一个相同的 Name
的文件=] 在这种情况下,您很可能在文件上弄错了,因为我们将从它的 [= 中得到 file path
15=].
所以我建议您创建一个 Object
,其中包含 Filename
和 Path
并将其添加到 list of songs
,以显示您需要 Dispalyed_Name
的项目,当您点击一首歌曲时,您将获得 Path
我觉得比较容易做。如果您不明白我的建议,请不要犹豫发表评论