2012-04-19 3 views
1

У меня возникла проблема с использованием AudioFocusChangeListener, но я все равно не могу прослушивать изменение фокусного расстояния. Может ли кто-нибудь помочь мне найти причины? Вот то, что я:AudioFocusChangeListener не может слушать

  1. В моем 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"); 
    } 
    
  2. При выходе из приложения в onDestroy(), я abandonAudioFocus() к релиз.

  3. Переменная член 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); 
        } 
    } 
    }; 
    
  4. По бревну, он печатает «Успешный просить audioFocus слушателя», но не печатается журнал AudioForcus изменения, когда сигнал тревоги или другие события с измененной звуком. Может ли кто-нибудь выяснить, что с ним не так?

  5. С другой стороны, я помещаю войти AudioService.java и AudioManger.java, где в AudioService.java, requestAudioFocus (!): если (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(); 
    
         } 
    
        } 
    
  6. в AudioManager.java, здесь не как преобразования приложений: частный IAudioFocusDispatcher mAudioFocusDispatcher = новый IAudioFocusDispatcher.Stub() {

    public void dispatchAudioFocusChange(int focusChange, String id) { 
    
        Message m = mAudioFocusEventHandlerDelegate.getHandler().obtainMessage(focusChange, id); 
    
        mAudioFocusEventHandlerDelegate.getHandler().sendMessage(m); 
    
    } 
    

Это все мой вопрос. Может ли кто-нибудь сказать мне, почему этот слушатель не может прослушивать события тревоги и другие события, связанные с изменением звука? Кстати, как я мог успешно слушать события? Может, я пропустил какой-то шаг или использовал неправильный путь? Большое спасибо.

ответ

1

Попробуйте это:

private class MyService extends Service implements AudioManager.OnAudioFocusChangeListener { 
    public void onAudioFocusChange(int focusChange) { 
     switch (focusChange) { 
      case AudioManager.AUDIOFOCUS_LOSS: 
       Log.e(TAG, "AudioFocus: received AUDIOFOCUS_LOSS, turning FM off"); 
       break; 
      case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: 
       Log.e(TAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK"); 
       break; 
      case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: 
       Log.e(TAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT"); 
       break; 
      case AudioManager.AUDIOFOCUS_GAIN: 
       Log.v(TAG, "AudioFocus: received AUDIOFOCUS_GAIN"); 
       break; 
      default: 
       Log.e(TAG, "Unknown audio focus change code " + focusChange); 
     } 
    } 

    public IBinder onBind(Intent intent) { 
     return null; 
    } 
} 

и ...

mAudioManager.requestAudioFocus(new MyService(), AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); 

Свои работы для меня.

+0

Спасибо, это кажется, что музыка и FM конфликты. Я решаю его, изменяя музыку. Музыкальное приложение было снято с фокуса после прерывания. Все же разрешите поблагодарить вас. – deercoder

0

DeerCoder,

Я считаю, что если вы запрашиваете аудио фокуса для типа AudioManager.STREAM_MUSIC, вы бы только получать события, влияющие на этот конкретный звуковой поток.

mAudioManager.requestAudioFocus(new MyService(), AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); 

Аварийные сигналы и уведомления управляются на отдельном звуковом потоке, таких как AudioManager.STREAM_NOTIFICATION, AudioManager.STREAM_ALARM, AudioManager.STREAM_RING и т.д ...

Смежные вопросы