2017-09-01 10 views
0

ライブストリーミングラジオのAndroidアプリで作業しています...私は4トラックの配列を持っています。リストの最後に到達すると、次のボタンが "最後の曲 "しかしそれはしないし、アプリケーションをクラッシュします。ここで Android - Mediaplayer次のボタンが機能しない

は、ボタンのコードです:

counter=0; 

    mediaPlayer=new MediaPlayer(); 
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

    btn_next.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      if (counter < songurl.length) { 
       counter = counter + 1; 
       textview.setText(songurl[counter]); 
       try { 
        mediaPlayer.reset(); 
       } catch (Exception ex) { 
        try { 
         mediaPlayer.setDataSource(songurl[counter]); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        try { 
         mediaPlayer.prepare(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        mediaPlayer.start(); 
       } 
      } else { 

       Toast.makeText(MainActivity.this, "last song", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 

もう一つ質問...私はアプリが最後の曲に達したときにそれを閉ループを作りたい場合には、私はリストを開始、[次へ]をクリックしますどのように私はそれを行うことができますか?おかげさまで

+0

1行目でカウンタ= 0ではなく、カウンタを1に設定します。 – ramji

答えて

-1

ループを作成するには、カウンタがsongurl.lengthと等しいかどうかをonclicklistenerでチェックする必要があります。これはプレイリストの曲の総数と思います。それはループになりますように、私は0にカウンターを設定しているのelseif条件で

int counter=0; 

    MediaPlayer mediaPlayer=new MediaPlayer(); 
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

    btn_next.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      if (counter < songurl.length) { 
       counter = counter + 1; 
       textview.setText(songurl[counter]); 
       try { 
        mediaPlayer.reset(); 
       } catch (Exception ex) { 
        try { 
         mediaPlayer.setDataSource(songurl[counter]); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        try { 
         mediaPlayer.prepare(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        mediaPlayer.start(); 
       } 
      } else if(counter == songurl.length) { 

       counter = 0; 
       // Toast.makeText(MainActivity.this, "last song", Toast.LENGTH_SHORT).show(); 
       textview.setText(songurl[counter]); 
       try { 
        mediaPlayer.reset(); 
       } catch (Exception ex) { 
        try { 
         mediaPlayer.setDataSource(songurl[counter]); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        try { 
         mediaPlayer.prepare(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        mediaPlayer.start(); 
       } 
      } 
     } 
    }); 

+0

このコードは、元のコードと同じ方法でクラッシュします。そのカウンターが配列の長さよりも小さいかどうかを確認してから、カウンターをインクリメントしないでください。 – Dave

+0

私はちょうどループのことの論理を教えてください...私はその論理が良いと思う... –

0

あなたが持っている1つの問題は、範囲内にあることを確認した直後にカウンターをインクリメントしていることです。これは、安全性チェックが役に立たないことを意味します。 counter = counter + 1;をifステートメントの最後に移動します。

ループを連続的にする限り、ifステートメント本体の末尾でcounter = (counter + 1) % songurl.length;に変更できます。

質問した質問の範囲を超えて、MediaPlayerの使用にいくつかの問題があります。 catchステートメントに重要なロジックを持つのは意味がありません。つまり、例外が発生すると予想されます。あなたはそこで何をしているのか再考すべきです。

2

あなたは(mediaPlayer.setDataSourceと呼ばれる参照elseブロック

btn_next.setOnClickListener(new View.OnClickListener(){ 
    @Override 
    public void onClick(View v) { 
     counter = counter++ % songurl.length 
     textview.setText(songurl[counter]); 
     try { 
      mediaPlayer.reset(); 
     } catch (Exception ex) { 
      try { 
       mediaPlayer.setDataSource(songurl[counter]); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      try { 
       mediaPlayer.prepare(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      mediaPlayer.start(); 
     } 

    } 
}); 
0

場合は、単に剰余(%)あなたのコード内のオペレータ

counter = counter++ % songurl.length

余分を追加する必要はありませんを追加することができますsongurl [counter])をキャッチブロックに追加します。 あなたがmediaPlayer.reset(呼び出すときに例外を持っていない場合はどのような)

これを試してみてください。

try{ 
    mediaPlayer.reset(); 
    mediaPlayer.setDataSource(); 
    mediaPlayer.prepareAsync();--or mediaPlayer.prepare(); 
    (It depends on whether you load the url on the internet) 
    mediaPlayer.start(); -- if you call mediaPlayer.prepareAsync() you should call mediaPlayer.start() at the OnPreparedListener; 

mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mediaPlayer) { 
       mediaPlayer.start(); 
      } 
     }); 
} 

そして、あなたはまだ迷っている場合、私はあなたがMediaPlayの状態について何かを読むことをお勧めします。

PS mediaPlayerが再生していて、もう1つ再生させたい場合は、まずmediaPlayer.stop()を呼び出します。

+0

もう一つ、if(counter == 4)counter = 0; –

関連する問題