【问题标题】:handle media player error gracefully优雅地处理媒体播放器错误
【发布时间】:2015-07-10 13:16:06
【问题描述】:

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

这是我正在尝试的代码

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();
    }
}

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

【问题讨论】:

  • 由于你的代码崩溃了,贴出崩溃的stacktrace来帮助找到问题。

标签: android error-handling media-player


【解决方案1】:

与其只是在您的代码上贴上创可贴,不如找出真正的问题所在可能更明智。如果您可以找到收到错误的行,您可以简单地将代码包装在

try{
     //code that crashes here
} 

catch(Exception e){
  Toast.makeText(context, "Media error", LENGTH_SHORT).show();
}

编辑: 请注意,简单地通过 try/catch 来防止崩溃本身可能会导致错误。如果您可以发布您的 logcat,我们或许能够弄清楚您的实际错误是什么。

【讨论】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多