2

私は 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);
                }
            }   
    }
}

}

4

1 に答える 1

11

AUDIOFOCUS_GAIN を使用する代わりに、AUDIOFOCUS_GAIN_TRANSIENT を使用します。

これは、 audiofocus_gain がすべてのアプリに再生を停止することを意味するためです。これは、一時的にフォーカスを放棄するまでアプリが一時停止する必要があることを意味しているのに対し、フォーカスを保持できる時間が分からないためです。

続きを読む: http://developer.android.com/reference/android/media/AudioManager.html#AUDIOFOOCUS_GAIN_TRANSIENT

于 2013-07-06T19:24:17.667 に答える