我正在使用一种方法来初始化和准备MediaPlayer(定义为类变量)。它以String(歌曲名称)作为参数,并将DataSource设置为该特定路径。

public void create_and_prepare_song(String x) {
    if (mp != null)
        mp.release();
    mp = new MediaPlayer();
    String filePath = Environment.getExternalStorageDirectory().getPath() + "/songsfolder/" + x + ".mp3";

    try {
        mp.setDataSource(filePath);
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        mp.prepare();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}


现在,在我的代码中的某处,我使用此方法初始化并准备“ 1.mp3”。然后,一旦完成这首歌,我就使用onCompletionListener,以便之后播放“ 2.mp3”,然后播放“ 3.mp3”。我用:

create_and_prepare_song("1");
i = 2;
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
    if (i <= 3) {
        String int_to_String = i + "";
        create_and_prepare_song(int_to_String); //1
        mp.setOnCompletionListener(this);
        mp.start();
        i++;
        }
    }
});
mp.start();


现在,这导致应用停止运行!但是,如果我只是将方法的主体复制并粘贴到// 1行,则该应用程序可以正常工作,播放第一首,第二首和第三首歌曲。为什么呢?非常感谢

最佳答案

请注意,您正在create_and_prepare_song()内创建一个新播放器,但旧的播放器仍在侦听器内部被引用。

这是因为全局变量和onCompletion参数具有相同的名称:mp

这是起作用的代码:

package com.example.simon.mplaylist;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import java.io.IOException;

/**
 * Created by Simon on 2014 Jul 20.
 */

public class MainActivity extends Activity {

    static int currentSong;
    static MediaPlayer mediaPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (mediaPlayer != null)
            return;

        currentSong = 1;
        create_and_prepare_song(currentSong);

        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                if (currentSong++ >= 3) {
                    mediaPlayer = null;
                    return;
                }
                create_and_prepare_song(currentSong);
                mediaPlayer.setOnCompletionListener(this);
                mediaPlayer.start();
            }
        });
        mediaPlayer.start();

    }

    public void create_and_prepare_song(int songNum) {
        if (mediaPlayer != null)
            mediaPlayer.release();
        mediaPlayer = new MediaPlayer();

        String storage = Environment.getExternalStorageDirectory().getPath();
        String filePath = storage + "/songsfolder/" + String.valueOf(songNum) + ".mp3";

        try {
            mediaPlayer.setDataSource(filePath);
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            mediaPlayer.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


注意,我将MediaPlayer定义为静态,并且还在检查@onCreate是否存在。这样一来,您可以避免在重新创建活动(例如屏幕旋转)时一次播放多首歌曲的情况。

10-07 13:09
查看更多