11

奇妙な問題があります。でprepareAsyncメソッドを使用しますMediaPlayerが、宣言したリスナーが起動されることはありません。.mp3インターネット(ラジオ局)からライブフィードをストリーミングしようとしています。リスナーにはインラインメソッドを使用していますが、インターフェイスの実装も試みましたが、成功しませんでした。これが私のコードの一部です:

メンバーセクション:

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

活動中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();

次に、preparePlayer()方法は次のとおりです。

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

そして(記録のために)、onDetroy()私が掃除をする場所:

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

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

2 に答える 2

11

OnPreparedListenerの create メソッドでを設定しActivity、後で、メソッドで new を作成する可能性がありMediaPlayerますpreparePlayer()。新しく作成されMediaPlayerた にはセットがありませんprepareListenererrorlistenerまた、何が起こっているのかを調べるために を追加する必要があります。

setOnPreparedListenerコールを

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

同様に次のように設定しますsetOnErrorListener

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

に変更e.printStackTrace();してください

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

これが役立つことを願っています。これも役立つので、ログデータがある場合はお知らせください。

于 2012-04-24T23:24:28.307 に答える
2

結局、内部メソッドの上に「@Override」について言及するのを忘れました。このような :

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

これですべてが正常に機能します。ええと...ほとんど、バッファリングするのに永遠にかかるので...

于 2012-04-26T18:27:16.913 に答える