2012-04-24 21 views
10

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

メンバーセクションで

活動onCreate()

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

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():あなたのActivity年代にOnPreparedListenerを設定している

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

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

ログには何が起こったのか何かエラーがありますか?あなたはインターネットへのアクセス許可を持っていますか? – zapl

答えて

10

は、新しいを作成し、おそらく、後にメソッドを作成し、 preparePlayer()メソッドのMediaPlayer新しく作成されたMediaPlayerには、prepareListenerが設定されていません。また、何が起きているかを知るためにerrorlistenerを追加する必要があります。

あなたは

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

内部setOnPreparedListenerコールを移動するだけでなく、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); 

希望にこのあなたがこのようなログデータを持っているかどうかをお知らせください有用であろう。

+0

ありがとう!あなたのアドバイスを使用していますか?しかし、それは私の問題を解決しませんでした。 –

+0

ありがとう!非常によく説明された – Manza

1

私は内部メソッドの上に "@Override"と言いました。このように:

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

すべて正常です。まあ...バッファリングにはいつまでもかかっているのでほとんど...

+0

D'oH !!!ハハ...あなたはそれを考えてうれしい!! :) – petey

+1

かなり古いですが、@Overrideステートメントはコード*を生成しないため、このコードや他のコード関連の問題の解決策にはなりません。参考までにhttp://stackoverflow.com/a/8545586/2177061を参照してください。 – Rick77

+0

これはおそらくこの問題の原因ではありません。私は今、まったく同じ問題を抱えており、 "上書き"を設定しても助けにはならない。サンプルアプリケーションでも、それを設定していませんでした。 –