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,其中包含 FilenamePath 并将其添加到 list of songs,以显示您需要 Dispalyed_Name 的项目,当您点击一首歌曲时,您将获得 Path我觉得比较容易做。如果您不明白我的建议,请不要犹豫发表评论