2013-09-16 63 views
0
private static int changedFocus; 
private static boolean focusGranted; 
private static AudioManager audioManager; 

public static int getChangedFocus() { 
    return changedFocus; 
} 

public static boolean isFocusGranted() { 
    return focusGranted; 
} 

public static void requestFocus(final Context context) { 
    if (audioManager == null) { 
     audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
    } 
    switch (audioManager.requestAudioFocus(OnFocusChangeListener.getInstance(), 
      AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN)) { 
     case AudioManager.AUDIOFOCUS_REQUEST_GRANTED: 
      focusGranted = true; 
      break; 

     case AudioManager.AUDIOFOCUS_REQUEST_FAILED: 
      focusGranted = false; 
      break; 
    } 
} 

private static final class OnFocusChangeListener implements AudioManager.OnAudioFocusChangeListener { 

    private static OnFocusChangeListener instance; 

    protected static OnFocusChangeListener getInstance() { 
     if (instance == null) { 
      instance = new OnFocusChangeListener(); 
     } 
     return instance; 
    } 

    @Override 
    public void onAudioFocusChange(final int focusChange) { 
     changedFocus = focusChange; 
     System.out.println("on focus change: " + focusChange); 
     switch (focusChange) { 
      case AudioManager.AUDIOFOCUS_GAIN: 
       GlobalMusicPlayer.onFocusGained(); 
       break; 

      case AudioManager.AUDIOFOCUS_LOSS: 
       GlobalMusicPlayer.onFocusLoss(); 
       break; 

      case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: 
       GlobalMusicPlayer.onFocusLossTransient(); 
       break; 

      case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: 
       GlobalMusicPlayer.onFocusLossTransientCanDuck(); 
       break; 
     } 
    } 
} 

我調用requestFocus(context)並獲取AudioManager.AUDIOFOCUS_REQUEST_GRANTED作爲返回值。onAudioFocusChange not called

之後,onAudioFocusChange從來沒有所謂的,因此changedFocus始終爲0

isFocusGranted() // true 
getChangedFocus() // 0 

設備:Nexus 10上,摩托羅拉XOOM。

回答

4

onAudioFocusChange()case AudioManager.AUDIOFOCUS_GAIN更多的是一種AudioFocus重新獲得的。它只會在失敗事件後觸發。

case AudioManager.AUDIOFOCUS_REQUEST_GRANTED是您應該在其中添加另一個GlobalMusicPlayer.onFocusGained()的地方。

+0

謝謝。我認爲AUDIOFOCUS_REQUEST_GRANTED意味着我將在不久的將來收到通知。 –

1

其實我看不出你的代碼有什麼問題,所以我創建了一個小測試活動。

要測試音頻焦點偵聽器,您必須開始此活動,使用「Home」按鈕將其最小化,然後啓動一些音樂播放器(在模擬器上測試一個音樂播放器) - 您應該能夠看到'Focus LOST'音樂開始播放後。當你停止音樂時 - 你應該看到'聚焦增益'信息。

此外,here是有關處理音頻焦點(只留下在這裏以供將來參考)好文章

import android.content.Context; 
import android.media.AudioManager; 
import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

private static final String TAG = MainActivity.class.getSimpleName(); 

private AudioManager mAudioManager; 
private AudioFocusChangeListenerImpl mAudioFocusChangeListener; 
private boolean mFocusGranted, mFocusChanged; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 

    mAudioFocusChangeListener = new AudioFocusChangeListenerImpl(); 
    int result = mAudioManager.requestAudioFocus(mAudioFocusChangeListener, 
      AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); 

    switch (result) { 
     case AudioManager.AUDIOFOCUS_REQUEST_GRANTED: 
      mFocusGranted = true; 
      break; 
     case AudioManager.AUDIOFOCUS_REQUEST_FAILED: 
      mFocusGranted = false; 
      break; 
    } 

    String message = "Focus request " + (mFocusGranted ? "granted" : "failed"); 
    Toast.makeText(this, message, Toast.LENGTH_LONG).show(); 
    Log.i(TAG, message); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    mAudioManager.abandonAudioFocus(mAudioFocusChangeListener); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

private class AudioFocusChangeListenerImpl implements AudioManager.OnAudioFocusChangeListener { 

    @Override 
    public void onAudioFocusChange(int focusChange) { 
     mFocusChanged = true; 
     Log.i(TAG, "Focus changed"); 

     switch (focusChange) { 
      case AudioManager.AUDIOFOCUS_GAIN: 
       Log.i(TAG, "AUDIOFOCUS_GAIN"); 
       Toast.makeText(MainActivity.this, "Focus GAINED", Toast.LENGTH_LONG).show(); 
       break; 
      case AudioManager.AUDIOFOCUS_LOSS: 
       Log.i(TAG, "AUDIOFOCUS_LOSS"); 
       Toast.makeText(MainActivity.this, "Focus LOST", Toast.LENGTH_LONG).show(); 
       break; 
      case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: 
       Log.i(TAG, "AUDIOFOCUS_LOSS_TRANSIENT"); 
       Toast.makeText(MainActivity.this, "Focus LOST TRANSIENT", Toast.LENGTH_LONG).show(); 
       break; 
      case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: 
       Log.i(TAG, "AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK"); 
       Toast.makeText(MainActivity.this, "Focus LOST TRANSIENT CAN DUCK", Toast.LENGTH_LONG).show(); 
       break; 
     } 
    } 
} 
}