目標: ボタンを 3 回クリックして、サウンドの再生を開始、停止、開始する
皆さんこんにちは
私はAndroidが初めてです。
ボタンをクリックしてサウンドの再生を停止した後、再生を再開するのに問題がありました。
この問題
(リンク)を調査し、適用するさまざまな方法を見つけました。
そのため、これを行うために 4 つの方法を (失敗して) 試しました。
異なる方法を使用する 4 つのボタンがあります。
ボタン 1 はコントロールとして使用されます。
さまざまな方法の結果については、コメントを参照してください。
以下に、LogCat からいくつかのエントリを投稿します。
ありがとうございました
関連する Android 状態図へのリンクは次のとおりです。
src/com.example.playsound/MainActivity.java
package com.example.playsound;
import java.io.IOException;
import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
//Create Media Player
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Button Sound
final MediaPlayer mPlayer1 = MediaPlayer.create(MainActivity.this, R.raw.playsound0);
final MediaPlayer mPlayer2 = MediaPlayer.create(MainActivity.this, R.raw.playsound1);
final MediaPlayer mPlayer3 = MediaPlayer.create(MainActivity.this, R.raw.playsound2);
final MediaPlayer mPlayer4 = MediaPlayer.create(MainActivity.this, R.raw.playsound3);
//Button References
Button button1 = (Button)this.findViewById(R.id.button1);
Button button2 = (Button)this.findViewById(R.id.button2);
Button button3 = (Button)this.findViewById(R.id.button3);
Button button4 = (Button)this.findViewById(R.id.button4);
//Button 1 OnClickListener
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mPlayer1.isPlaying() ) {
try {
mPlayer1.stop();
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
// BUTTON 1
else { // plays sound upon first click, stops on second click
try { // but does not play on third click
mPlayer1.start();
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
}
});
//Button 2 Uses .prepareAsync()
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mPlayer2.isPlaying() ) { // BUTTON 2
try { // Plays sound upon first click, stops on second click
mPlayer2.stop(); // But will not play upon third click
mPlayer2.reset();
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
else {
try {
mPlayer2.prepareAsync();
} catch (IllegalStateException e) {
e.printStackTrace();
}
mPlayer2.start();
}
}
});
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mPlayer3.isPlaying() ) {
try { // BUTTON 3
mPlayer3.stop(); // Does not play sound upon first button click
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
else {
mPlayer3.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mPlayer3) {
mPlayer3.start();
}
});
}
}
});
//Button 4 OnClickListener
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mPlayer4.isPlaying() ) {
try {
mPlayer4.stop();
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
// BUTTON 4
else { // does not play sound on first click
try {
mPlayer4.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mPlayer4.start();
}
}
});
}
}
LogCat のほとんどのエラーは次のようなものです。
状態 8 で呼び出された prepareAsync
状態 0 で呼び出しを開始
状態 1 で呼び出しを開始
ほとんどのエラーは「call in state #」エラーです。
上記のリンクに掲載されている図を参考にしました。
正しい場所でメソッドを呼び出そうとすると、まだこれらのエラーが発生します。