2013-07-18 11 views
9

私のコードでは、この問題の解決策を探しているさまざまなWebサイトを見てきました。再生、一時停止、停止の3つのボタンを備えた基本的なオーディオプレーヤーです。再生と一時停止作業を[OK]をので、止めるんが、オーディオがエラーを投げ、それを再び開始することを拒否停止された後:Android MediaPlayerエラー(-38,0)「状態0で呼び出しが中止されました」

E/MediaPlayer: stop called in state 0 
E/MediaPlayer: error (-38, 0) 
E/MediaPlayer: Error (-38,0) 

これは私のMainActivity.javaです:

import android.app.Activity; 
import android.media.MediaPlayer; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.SeekBar; 

import java.io.IOException; 

public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener { 

    static Button playButton; 
    static Button pauseButton; 
    static Button stopButton; 
    static SeekBar seekBar; 
    private static MediaPlayer player; 
static Handler handler; 
static Uri audio; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    player = MediaPlayer.create(this, R.raw.airbourne_runnin_wild); 
    Uri audio = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.airbourne_runnin_wild); 
    try { 
     player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    playButton = (Button) findViewById(R.id.playButton); 
    pauseButton = (Button) findViewById(R.id.pauseButton); 
    stopButton = (Button) findViewById(R.id.stopButton); 
    seekBar = (SeekBar) findViewById(R.id.seekBar); 

    player.setOnPreparedListener(this); 

    handler = new Handler(); 

    seekBar.setMax(player.getDuration()); 

    playButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      if (!player.isPlaying()) { 
       try { 
        player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       player.start(); 
       updateSeekBar(); 
      } 
     } 
    }); 

    pauseButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      if (player.isPlaying()) { 
       player.pause(); 
      } 
     } 
    }); 

    stopButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      if (player.isPlaying()) { 
       player.stop(); 
       seekBar.setProgress(0); 
       seekBar.invalidate(); 
       try { 
        player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }); 

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
      if (b) { 
       seekChanged(seekBar, i, b); 
      } 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 

     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 

     } 
    }); 

    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mediaPlayer) { 
      player.stop(); 
      seekBar.setProgress(0); 
      //player.prepareAsync(); 
      seekBar.invalidate(); 
     } 
    }); 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public void onPrepared(MediaPlayer mediaPlayer) { 
    playButton.setEnabled(true); 
} 

public void seekChanged(SeekBar seekBar, int progress, boolean fromUser) { 
    player.seekTo(progress); 
} 

public void updateSeekBar() { 
    seekBar.setProgress(player.getCurrentPosition()); 

    if (player.isPlaying()) { 
     Runnable notification = new Runnable() { 
      public void run() { 
       updateSeekBar(); 
      } 
     }; 
     handler.postDelayed(notification, 1500); 
    } 
} 
} 

とactivity_main。 XML:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context=".MainActivity"> 

<TableRow 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

    <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Play" 
      android:id="@+id/playButton" 
      android:layout_gravity="center_horizontal|top" 
      android:longClickable="false" 
      android:layout_weight="1" 
      android:layout_column="8" 
      android:enabled="false"/> 
</TableRow> 

<TableRow 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

    <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Pause" 
      android:id="@+id/pauseButton" 
      android:layout_gravity="center_horizontal|top" 
      android:layout_weight="1" 
      android:layout_column="8" 
      android:layout_span="7"/> 
</TableRow> 

<TableRow 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

    <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Stop" 
      android:id="@+id/stopButton" 
      android:layout_column="8" 
      android:layout_span="24" 
      android:layout_weight="1"/> 
</TableRow> 

<TableRow 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
</TableRow> 

<TableRow 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

    <SeekBar 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/seekBar" 
      android:layout_column="8" 
      android:layout_span="24" 
      android:layout_weight="1"/> 
</TableRow> 

誰も私がこのエラーを解決するのに役立つことができれば、それは次のようになりとても有難い。私はすでに解決策を探し回って複数回試しましたが、どれも正しく動作していないようです。

編集:私は、コードを少し変更:

私の質問は、エラーについてはまだです、これは今私の編集したコードです:

import android.app.Activity; 
import android.media.MediaPlayer; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.SeekBar; 

import java.io.IOException; 

public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener { 

static Button playButton; 
static Button pauseButton; 
static Button stopButton; 
static SeekBar seekBar; 
private static MediaPlayer player; 
static Handler handler; 
static Uri audio; 
static boolean canMakeCall = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    player = MediaPlayer.create(this, R.raw.airbourne_runnin_wild); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    playButton = (Button) findViewById(R.id.playButton); 
    pauseButton = (Button) findViewById(R.id.pauseButton); 
    stopButton = (Button) findViewById(R.id.stopButton); 
    seekBar = (SeekBar) findViewById(R.id.seekBar); 

    if (canMakeCall = true) { 
     player.setOnPreparedListener(this); 

     handler = new Handler(); 

     seekBar.setMax(player.getDuration()); 

     playButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       if (!player.isPlaying()) { 
        player.start(); 
        updateSeekBar(); 
       } 
      } 
     }); 

     pauseButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       if (player.isPlaying()) { 
        player.pause(); 
       } 
      } 
     }); 

     stopButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       if (player.isPlaying()) { 
        player.stop(); 
        seekBar.setProgress(0); 
        seekBar.invalidate(); 
        try { 
         player.prepare(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }); 

     seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
       if (b) { 
        seekChanged(seekBar, i, b); 
       } 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 

      } 
     }); 

     player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mediaPlayer) { 
       mediaPlayer.stop(); 
       //player.stop(); 

       seekBar.setProgress(0); 
       //player.prepareAsync(); 
       seekBar.invalidate(); 
      } 
     }); 
    } 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public void onPrepared(MediaPlayer mediaPlayer) { 
    playButton.setEnabled(true); 
    canMakeCall = true; 
} 

public void seekChanged(SeekBar seekBar, int progress, boolean fromUser) { 
    player.seekTo(progress); 
} 

public void updateSeekBar() { 
    seekBar.setProgress(player.getCurrentPosition()); 

    if (player.isPlaying()) { 
     Runnable notification = new Runnable() { 
      public void run() { 
       updateSeekBar(); 
      } 
     }; 
     handler.postDelayed(notification, 1500); 
    } 
} 
} 

私はせずに作業基本を取得しようとしていますシークバーもエラーの原因ではないことを確認するだけですが、シークバーコードを省略しても同じエラーが発生していたため、再生/一時停止/停止コードのロジックのどこかにあります。

+0

[AndroidのMediaPlayerの問題:「エラー(-38、0)」と「状態1で呼び出さ停止」]の可能複製(HTTP ://stackoverflow.com/questions/11913108/android-mediaplayer-problems-error-38-0-and-stop-called-in-state-1) – rds

答えて

8

問題は、あなたがそれを停止したら、あなたは再びsetDataSourceです。あなたは、あなたが再びprepare()にそれを必要とします、あなたがそれにsetDataSource()を呼び出すprepare()

player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor()); 
player.prepare(); 

いつでも呼び出す必要があります。ファイルをロードして、再生の準備をしていると考えてください。

ところで、私はあなたがMediaPlayer.create()を呼び出して混乱していることに気付き、同じファイルに対して複数回setDataSource()を呼び出します。これを行う必要はありません。 MediaPlayerのは(.create()を呼び出すと、あなたのためにしている)を作成し、作成されたら、あなただけの、それにすべての時間をリセットする必要が.stop().pause().play()を呼び出すことはできません。

+0

私はちょうど.setDataSourceとを削除するには、コードを変更しました関連するtry ... catchステートメントが、コードはまだ同じエラーを生成しています。再生を押すと、再生が始まり、SeekBarがうまく動き、一時停止がうまくいき、停止するが、何らかの理由でシークバーがゼロにリセットされない。 – uberdum05

+0

コードを変更したところで何が起きているのか、それはあなたの質問と一致せず、見るべき行番号を持つスタックトレースはありません。私はあなたの質問があなたのシークバーに関するものであるのか、間違った状態で呼ばれているのかという本来のエラーに関するものなのかどうかは分かりません。もし私があなただったら、私はシークバーなしで働く基礎を得るでしょう。 –

+0

上記の私の編集を参照してください、DNSサーバが私の仕事で亡くなったので、返信にもしばらく時間がかかりました。 – uberdum05

1

player.setOnCompletionListener()のためにプレイヤーが曲を終了したときに呼び出されたplayer.stop()を削除してこの問題を解決しました。これで問題は解決し、プレーヤーは完全に動作しています。

0

この問題は `mediaPlayer.prepare();で解決しました。私の問題は、ラジオのライブストリーミングについてです、私はコードの下のように、この問題を達成:

if (!radioIsOpen) { 
       try { 
        mediaPlayer = new MediaPlayer(); 
        mediaPlayer 
          .setDataSource(URL); 
        mediaPlayer.prepare(); 
       } catch (Exception e) { 
       } 

       mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 

        public void onPrepared(MediaPlayer mp) { 
         mediaPlayer.start(); 
        } 
       }); 
       Toast.makeText(getBaseContext(), "Radio is opening...", 2).show(); 
      } else { 
       if (mediaPlayer.isPlaying()) { 
        mediaPlayer.stop(); 
        mediaPlayer.release(); 
        Toast.makeText(getBaseContext(), "Radio is closing...", 2).show(); 
       } 
      } 
関連する問題