私は Android で何らかの変更されたタイマーを作成しようとしています。ボタンを押すと、新しいスレッドが開始され、時間が計算され、場合によってはサウンドが再生されます。サウンドの再生中に Audio Focus - MP3 Player がバックグラウンドで再生され、状態が「一時停止」に変わります。しかし、後で問題が発生しました。放棄フォーカス メソッドを呼び出しますが、MP3 プレーヤーはまだ一時停止しています。このような状況ではアドバイスを見つけることができません。私が行った放棄オーディオフォーカス()を呼び出す必要があるという情報だけです。
私のコードは以下です。短くするためにいくつかの部分を変更しましたが、それでも長いです。プログラムの全体構成を紹介したいので、全部見せました。これは私の最初の Android アプリケーションなので、エラーはばかげている可能性があります :)
public class MainActivity extends Activity{
Button p1;
Thread thread;
MyRunnable rn;
private boolean mPaused = false;
MediaPlayer mp = null;
AudioManager audioMeg;
int time = 0;
int interval = 0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//set text and similar things
PressStart startList = new PressStart();
p1.setOnClickListener(startList);
mp = MediaPlayer.create(this, R.raw.alarm2);
audioMeg = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
//something more here
}
class PressStart implements OnClickListener{
@Override
public void onClick(View arg0) {
//calculate time and interval
if(mPaused == false){
rn = new MyRunnable();
thread = new Thread(rn);
thread.start();
}
else{
rn.onResume();
}
}
}
class AFChangeListener implements OnAudioFocusChangeListener{
@Override
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT){
mp.pause();
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
mp.start();
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
mp.stop();
}
}
}
class MyRunnable implements Runnable {
private Object mPauseLock;
public MyRunnable() {
mPauseLock = new Object();
mPaused = false;
}
@Override
public void run() {
int focus;
AFChangeListener afChangeListener = new AFChangeListener();
for(int i = 0; i < time + 1; i++){
synchronized (mPauseLock) {
while (mPaused) {
mPauseLock.wait();
}
}
if(!mPaused){
if((i % interval == 0)){
//================================
focus = audioMeg.requestAudioFocus(afChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
if(focus == AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
mp.start();
}
//while(mp.isPlaying()); when it is uncommented abandon focus still doesn't work
audioMeg.abandonAudioFocus(afChangeListener);
//=========================================
}
//something more here
Thread.sleep(1000);
}
}
}
}
}