优雅地处理媒体播放器错误



我正在尝试处理一个媒体播放器错误,当错误发生时,我想烤一条消息,然后播放下一首歌曲,但是每当错误发生时,它就会崩溃。

这是我正在尝试的代码

public class player1 extends ActionBarActivity implements View.OnClickListener,OnErrorListener{
    MediaPlayer mp;
    ArrayList<File> mySongs;
    int position;
    Uri u;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_player);
        Intent i = getIntent();
        Bundle  b = i.getExtras();
        mySongs = (ArrayList) b.getParcelableArrayList("songlist");
        position = b.getInt("pos", 0);
        u = Uri.parse(Uri.encode(mySongs.get(position).toString()));
        mp = MediaPlayer.create(getApplicationContext(), u);
        mp.start();

    }
    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        String errorWhat;
        switch(what){
            case MediaPlayer.MEDIA_ERROR_UNKNOWN:
                errorWhat = "MEDIA_ERROR_UNKNOWN";
                break;
            case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
                errorWhat = "MEDIA_ERROR_SERVER_DIED";
                break;
            default:
                errorWhat = "!";
        }
        String errorExtra;
        switch(extra){
            case MediaPlayer.MEDIA_ERROR_IO:
                errorExtra = "MEDIA_ERROR_IO";
                break;
            case MediaPlayer.MEDIA_ERROR_MALFORMED:
                errorExtra = "MEDIA_ERROR_MALFORMED";
                break;
            case MediaPlayer.MEDIA_ERROR_UNSUPPORTED:
                errorExtra = "MEDIA_ERROR_UNSUPPORTED";
                break;
            case MediaPlayer.MEDIA_ERROR_TIMED_OUT:
                errorExtra = "MEDIA_ERROR_TIMED_OUT";
                break;
            default:
                errorExtra = "!";
        }
        Toast.makeText(player1.this, 
                "Error" + "n"
                        + errorWhat + "n"
                        + errorExtra,
                        Toast.LENGTH_LONG).show();
        //release
        mp.stop();
        mp.release();
        initMediaPlayer();
        return true;
    };
    private void initMediaPlayer() {
        Toast.makeText(player1.this, 
            "playomng next song", 
            Toast.LENGTH_LONG).show();
        position = (position + 1)%mySongs.size();
        u = Uri.parse(Uri.encode(mySongs.get(position).toString()));
        mp = MediaPlayer.create(getApplicationContext(), u);
        mp.start();
    }
}

如何在不强制媒体播放器关闭的情况下处理这些错误?

与其把创可贴贴在代码上,不如找出真正的问题在哪里。如果你能找到你收到错误的那一行,你可以简单地将代码包装在

中。
try{
     //code that crashes here
} 
catch(Exception e){
  Toast.makeText(context, "Media error", LENGTH_SHORT).show();
}

编辑:请注意,仅仅通过try/catch来防止崩溃本身就会导致bug。如果你能张贴你的日志,我们也许能找出你的实际错误是什么。

  • 没有logcat我们不能说太多,但是你没有设置播放器听错误mp.setOnErrorListener(this); .
  • 我认为你的崩溃可能是i.getExtras();,它可以是null,因此调用b.getParcelableArrayList("songlist");可能只是崩溃你的应用程序。

最新更新