AudioFocusChangeListener を使用して問題が発生しましたが、オーディオ フォーカスの変更を聞くことができません。誰かが理由を見つけるのを手伝ってくれますか? これが私がすることです:
私の FM アプリでは、FM が startFM で開始するときに、
requestAudioFocus()
リソースを取得する場所を配置します。int result = mAudioManager.requestAudioFocus(mAudioFocusListener, AudioManager.STREAM_FM,AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { Log.d(LOGTAG, "Successfull to request audioFocus listener"); } else { Log.d(LOGTAG, "Failure to request focus listener"); }
でアプリを終了するとき、
onDestroy()
リソースabandonAudioFocus()
を解放していました。メンバー変数
mAudioFocusListener
は次のとおりです。private OnAudioFocusChangeListener mAudioFocusListener = new OnAudioFocusChangeListener() { public void onAudioFocusChange(int focusChange) { switch (focusChange) { case AudioManager.AUDIOFOCUS_LOSS: Log.v(LOGTAG, "AudioFocus: received AUDIOFOCUS_LOSS, turning FM off"); if (isFmOn()) { fmOff(); } break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: Log.v(LOGTAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK"); if (isFmOn()) { Log.d(LOGTAG, "AudioFocus: FM is on, turning off"); mute(); stopFM(); } break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: Log.v(LOGTAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT"); if (isFmOn()) { Log.d(LOGTAG, "AudioFocus: FM is on, turning off"); mute(); stopFM(); } break; case AudioManager.AUDIOFOCUS_GAIN: Log.v(LOGTAG, "AudioFocus: received AUDIOFOCUS_GAIN"); if (isFmOn()) { Log.d(LOGTAG, "AudioFocus: FM is off, turning back on"); unMute(); startFM(); } break; default: Log.e(LOGTAG, "Unknown audio focus change code " + focusChange); } } };
ログによると、「Successfull to request audioFocus listener」が出力
AudioForcus
されますが、アラームがオンになっている場合やその他のオーディオ変更イベントの場合、変更ログは出力されません。誰がそれの何が悪いのか理解できますか?一方、AudioService.java と AudioManger.java にログを配置し、AudioService.java では requestAudioFocus(): if (!mFocusStack.empty() && (mFocusStack.peek().mFocusDispatcher != null)) {
try { mFocusStack.peek().mFocusDispatcher.dispatchAudioFocusChange( -1 * focusChangeHint, // loss and gain codes are inverse of each other mFocusStack.peek().mClientId); // This doesn't excute } catch (RemoteException e) { Log.e(TAG, " Failure to signal loss of focus due to "+ e); e.printStackTrace(); } }
プライベート IAudioFocusDispatcher mAudioFocusDispatcher = new IAudioFocusDispatcher.Stub() {
public void dispatchAudioFocusChange(int focusChange, String id) { Message m = mAudioFocusEventHandlerDelegate.getHandler().obtainMessage(focusChange, id); mAudioFocusEventHandlerDelegate.getHandler().sendMessage(m); }
それが私の質問です。このリスナーがアラーム イベントやその他のオーディオ フォーカス変更イベントをリッスンできない理由を誰か教えてもらえますか? ところで、どうすればイベントをうまく聞くことができますか? 多分私はいくつかのステップを逃したか、間違った方法を使用しましたか? どうもありがとう。