2013-07-25 12 views
9

私はAndroidを学んでおり、トグルボタン(再生/一時停止)とボタン(次へ)の2つのボタンを持つアクティビティを作成しました。私は「次へ」を押すとサイクリングしたい2曲があります。私は私が私の活動でのonClickをオーバーライド配列MediaPlayer:クライアント側でファイルを開くことができませんでした。エラー(-38,0)以上

int [] songs={R.raw.song1,R.raw.song2};

を持っています。最初の曲はうまく再生されます。しかし、次を押した後、私は次のエラーを取得:

は、クライアント側で開いているファイルは、サーバ側

E/MediaPlayerの(3107)をしようとしていませんでした:状態4

Eで呼び出さスタート/ MediaPlayerの(3107):エラー(-38、0)

E/MediaPlayerの(3107):エラー(-38,0)

E/MediaPlayerの(3107):エラー(1、-2147483648)

E/MediaPlayerの(3107):エラー(1、-2147483648)のonCreate(バンドル...)で

if(mp!=null) mp.release(); 
    mp=MediaPlayer.create(this, songs[count]); 

ここに私のonClick(ビューV)メソッドです:

public void onClick(View view) {  
    Log.v(TAG,"ID:"+view.getId()); 
    switch (view.getId()) { 
    case R.id.playerbutton: //ToggleButton 
     if(state==0) { 
      mp.start(); 
      state=1; 
     } 
     else if(state==1) { 
      state=0; 
      mp.pause(); 
     } 
    break; 

    case R.id.next: //Next button 
     Log.v(TAG,"Next button pressed!"); 
     count=(count+1)%2; //Have only two songs 
     mp.reset(); 
     try { 
      mp.setDataSource(this, Uri.parse("android.resource://com.example.myfirstapp"+songs[count])); 
      mp.setOnPreparedListener(this); 
      mp.prepareAsync(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     mp.start(); 
    break; 
    } 
} 
は、

基本的に、私は次のボタンを押すたびにこれをやっています: -reset mp(ie MediaPlayerのオブジェクト) がsetOnPreparedListenerまたはprepareAsyncを使用すると、次の曲 -start MP

を再生するための新しいデータソースを-set、私はthis SO questionをお読みください。

どこが間違っていますか?

+0

[Android MediaPlayerの問題:「エラー(-38,0)」と「状態1で停止しました」]の重複が可能です。(http://stackoverflow.com/questions/11913108/android-mediaplayer-problems-error- 38-0-stop-in-state-1) – rds

答えて

7

データソースの設定が間違っていると思います。

に変更し、それを:

mp.setDataSource(this, Uri.parse("android.resource://com.example.myfirstapp/"+songs[count])); 

お知らせパッケージ名の後に末尾にスラッシュ。

+0

ええ、気づかなかった!また、私はファイル(ストリームではない)から再生しているので、 'prepareAsync'を' prepare() 'に置き換えました。ありがとう!! –

関連する問題