2012-04-19 76 views
1

我遇到使用AudioFocusChangeListener的問題,但仍然無法聽到音頻焦點更改。有人能幫我找到原因嗎?這是我做的:AudioFocusChangeListener不能聽

  1. 在我FM的應用程序,在FM中startFM開始,我把​​獲得資源:

    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,這裏沒有任何EXCUTE: 私人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 2012-09-19 13:44:05

0

DeerCoder,

我相信,如果你所請求的音頻焦點類型AudioManager.STREAM_MUSIC,你只會收到影響這個特定的音頻流事件。

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

的報警和通知是在獨立的音頻流如AudioManager.STREAM_NOTIFICATION,AudioManager.STREAM_ALARM,AudioManager.STREAM_RING等管理...