新しいAndroidサウンドアプリケーションを作成しています。クリックするとサウンドを再生するクリック可能なボタンを作成しましたが、2回目にクリックするとサウンドの再生を停止したいのです。一部は正常に動作するようになりました。ボタンをもう一度クリックしてサウンドを再生すると、再生されません。メディアプレーヤーが完全に停止します。フォーラムを探していましたが、答えが見つからないようです。これが私の活動です:
MediaPlayer mpButtonClick1;
MediaPlayer mpButtonClick2;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.prvi);
final MediaPlayer mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm);
final MediaPlayer mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs);
Button dugme = (Button) findViewById(R.id.dugme);
dugme.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mpButtonClick1.isPlaying()) {
mpButtonClick1.stop();
mpButtonClick1.reset();
}
else {
mpButtonClick1.start();
}
}
});
MpButtonClick1.prepare();を書き込もうとするとエラーが発生する未処理の例外タイプIOE例外
以下のコードでクラスを変更します。
reset();
を削除します。
すべてのコンポーネントを適切に初期化します。
MediaPlayer mpButtonClick1;
MediaPlayer mpButtonClick2;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.prvi);
mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm);
mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs);
Button dugme = (Button) findViewById(R.id.dugme);
dugme.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mpButtonClick1.isPlaying()) {
mpButtonClick1.stop();
}
else {
mpButtonClick1.start();
}
}
});
これを試してください:1つのメディアプレーヤーオブジェクトのみを使用する必要があります
public class PlayaudioActivity extends Activity {
private MediaPlayer mp;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button b = (Button) findViewById(R.id.button1);
Button b2 = (Button) findViewById(R.id.button2);
final TextView t = (TextView) findViewById(R.id.textView1);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopPlaying();
mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.far);
mp.start();
}
});
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopPlaying();
mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.beet);
mp.start();
}
});
}
private void stopPlaying() {
if (mp != null) {
mp.stop();
mp.release();
mp = null;
}
}
}
簡単な解決策は、停止の代わりに一時停止を使用して、曲の先頭にシークすることです。
複数回プレイする必要があり、別のプレイを開始するために1つのプレイを停止する必要がある場合(複数のボタンの場合など)、別のプレーヤーを作成し、前のプレーヤーのリソースを解放するようにします。 。使用を停止するには
mediaPlayer.stop();
ただし、プレイの場合は、次のようなものを使用して(ログを特定のニーズに適合させて)、プレーヤーを作成/再作成します。
private boolean createMediaPlayer()
{
if (mediaPlayer!=null)
{
if(mediaPlayer.isPlaying())
{
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer=null;
}
}
mediaPlayer = new MediaPlayer();
mediaPlayer.setVolume(1f, 1f);
try
{
mediaPlayer.setAudioStreamType(Interop.PRIMARY_STREAM);
mediaPlayer.setDataSource(m_soundFile);
mediaPlayer.prepare();
return true;
// Interop.logDebug(TAG + "-loadAudio: SUCCESS" + m_soundFile);
} catch (Exception e)
{
Interop.logError(TAG + "-LoadAudio for Clic Sound: audioPlayer prepare failed for current file: " + m_soundFile);
Interop.logError(TAG + "-Exception: " , e);
return false;
}
}
そして使用するより
if (createMediaPlayer())
mediaPlayer.start();
これにより、メディアプレーヤーが使用するリソースが適切に解放されます。
ねえ、以下を使用してください
停止用->メディアプレーヤーmp.seekTo(0); mp.pause();
もう一度開始するには、mp.start();を呼び出します。
MpButtonClick1.stop()の後にmpButtonClick1.reset()を呼び出しています-これを行わないでください:
if (mpButtonClick1.isPlaying()) {
mpButtonClick1.stop();
mpButtonClick1.reset(); //<--------- calling reset(), remove this line
}
reset() のドキュメント:
MediaPlayerを初期化されていない状態にリセットします。このメソッドを呼び出した後、データソースを設定し、prepare()を呼び出して、このメソッドを再度初期化する必要があります。
MpButtonClick1.reset()を削除すると、機能するはずです。
MediaPlayerはステートマシンとして機能することに注意してください。つまり、メソッドを間違った順序で呼び出すと、問題が発生します。 MediaPlayerについてお読みください ここ および ここ 。
この質問はかなり古いことは知っていますが、最近Androidを学習しているときに、この時点で行き詰まり、非常に簡単な解決策を見つけて、みんなと共有したいと思います。
メディアを停止またはリセットしようとする代わりに、シークバックを開始位置に戻すことができます。
mediaPlayer.seekTo(0);
参考までに、以下にコードを投稿しています。
public class MainActivity extends AppCompatActivity {
MediaPlayer mp;
public void play(View view) {
mp.start();
}
public void pause(View view) {
mp.pause();
}
public void stop(View view) {
// this seeks to the beginning of the file
mp.seekTo(0);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mp = MediaPlayer.create(this, R.raw.sample_audio);
}
}