Android的MediaPlayer的prepareAsync方法 [英] AndroId MediaPlayer prepareAsync method

查看:3837
本文介绍了Android的MediaPlayer的prepareAsync方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个奇怪的问题。我用的是prepareAsync方法与的MediaPlayer ,但我声明只是从来没有被炒鱿鱼的听众。我试图流现场 MP3播放从网上(电台)饲料。我用一个内联方法的听众,但我也试过实现该接口没有任何成功。下面是我的code部分:

在构件截面:

 字符串URL =HTTP://< my_url> .MP3;
的MediaPlayer媒体播放器=新的MediaPlayer();
 

在活动的onCreate()

 切换按钮为playButton =(切换按钮)findViewById(R.id.playToggleButton);
playButton.setOnClickListener(本);
playButton.clearFocus();
playButton.setClickable(假);

mediaPlayer.setOn preparedListener(新在preparedListener(){
    公共无效于prepared(MediaPlayer的MP){
        切换按钮为playButton =(切换按钮)findViewById(R.id.playToggleButton);
        playButton.setClickable(真正的);
        mp.start();
    }
});

preparePlayer();
 

之后,这里的 preparePlayer()方法:

 私人无效preparePlayer(){
    如果(媒体播放器== NULL){
        媒体播放器=新的MediaPlayer();
    }
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    尝试 {
        mediaPlayer.setDataSource(URL);
        。媒体播放器prepareAsync();

    }赶上(抛出:IllegalArgumentException E){
        Toast.makeText(
                MyStreamActivity.this,
                getResources()的getString(R.string.erreurIllegalArgument)
                Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }赶上(IllegalStateException异常E){
        Toast.makeText(
                MyStreamActivity.this,
                getResources()的getString(R.string.erreurIllegalState)
                Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }赶上(IOException异常E){
        Toast.makeText(
                MyStreamActivity.this,
                getResources()的getString(R.string.erreurIO)
                Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
}
 

并(只是备案)时, onDetroy(),我做清洁:

 私人无效releaseMediaPlayer(){
    如果(媒体播放器!= NULL){
        如果(mediaPlayer.isPlaying()){
            mediaPlayer.stop();
        }
        mediaPlayer.release();
        媒体播放器= NULL;
    }
}

@覆盖
保护无效的onDestroy(){
    super.onDestroy();
    releaseMediaPlayer();
}
 

解决方案

正在设置在preparedListener在活动的创建方法,后来,有可能,创造了你的preparePlayer一个新的MediaPlayer()方法。任何新创建的MediaPlayer的不会有prepareListener集。您还应该添加一个errorlistener找出怎么回事。

您可能希望将西顿preparedListener调用内部的

 如果(媒体播放器== NULL){
    媒体播放器=新的MediaPlayer();
}
 

以及设置 setOnErrorListener 像这样:

 如果(媒体播放器== NULL){
    媒体播放器=新的MediaPlayer();
    mediaPlayer.setOnErrorListener(....);
    mediaPlayer.setOn preparedListener(新在preparedListener(){
        公共无效于prepared(MediaPlayer的MP){
            切换按钮为playButton =(切换按钮)findViewById(R.id.playToggleButton);
            playButton.setClickable(真正的);
            mp.start();
        }
    });
}
 

请修改 e.printStackTrace();

  Log.e(标签,e.getMessage(),E);
 

希望这会有所帮助,让我们知道,如果您有任何日志数据,这也将是有益的。

I have a strange problem. I use the prepareAsync method with the MediaPlayer, but the listener that I declared just never gets fired. I try to stream a live .mp3 feed from the Internet (radio station). I use an inline method for the listener, but I also tried implementing the interface without any success. Here's a portion of my code :

In the member section :

String url = "http://<my_url>.mp3";
MediaPlayer mediaPlayer = new MediaPlayer();

In Activity onCreate() :

ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton);
playButton.setOnClickListener(this);
playButton.clearFocus();
playButton.setClickable(false);

mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
    public void onPrepared(MediaPlayer mp) {
        ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton);
        playButton.setClickable(true);
        mp.start();
    }
});

preparePlayer();

Then, here's the preparePlayer() method :

private void preparePlayer() {
    if (mediaPlayer == null) {
        mediaPlayer = new MediaPlayer();
    }
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    try {
        mediaPlayer.setDataSource(url);
        mediaPlayer.prepareAsync();

    } catch (IllegalArgumentException e) {
        Toast.makeText(
                MyStreamActivity.this,
                getResources().getString(R.string.erreurIllegalArgument),
                Toast.LENGTH_LONG).show();
        e.printStackTrace();
    } catch (IllegalStateException e) {
        Toast.makeText(
                MyStreamActivity.this,
                getResources().getString(R.string.erreurIllegalState),
                Toast.LENGTH_LONG).show();
        e.printStackTrace();
    } catch (IOException e) {
        Toast.makeText(
                MyStreamActivity.this,
                getResources().getString(R.string.erreurIO),
                Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
}

And (just for the record), the onDetroy() where I do the cleaning :

private void releaseMediaPlayer() {
    if (mediaPlayer != null) {
        if(mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
        }
        mediaPlayer.release();
        mediaPlayer = null;
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    releaseMediaPlayer();
}

解决方案

You are setting the OnPreparedListener in your Activity's create method and later on, possibly, creating a new MediaPlayer in your preparePlayer() method. Any newly created MediaPlayer's wont have the prepareListener set. You should also add an errorlistener to find out whats going on.

You may want to move the setOnPreparedListener call inside the

  if (mediaPlayer == null) {
    mediaPlayer = new MediaPlayer();
}

as well as setting a setOnErrorListener like so:

if (mediaPlayer == null) {
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setOnErrorListener(....);
    mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
        public void onPrepared(MediaPlayer mp) {
            ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton);
            playButton.setClickable(true);
            mp.start();
        }
    });
}

Please change e.printStackTrace(); to

Log.e("tag", e.getMessage(), e);  

Hope this helps, let us know if you have any log data as this will also be useful.

这篇关于Android的MediaPlayer的prepareAsync方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆