2012-08-08 2 views
2

음악 플레이어 앱을 만들고 있습니다.Android : MediaPlayer AUDIOFOCUS_LOSS & setOnErrorListener() 문제

내 응용 프로그램에서 AudioFocus를 잃어 버렸는지 확인 중이면 재생이 중지됩니다. 그러나 이것은 트랙을 재생할 때 멈추고 멈추고 다시 트랙을 재생하는 한 가지 문제를 야기하고 있습니다. switch case AudioManager.AUDIOFOCUS_LOSS이 전화를 끊어서 플레이어가 포커스를 잃을 때 멈추었습니다.

내 자신의 앱이 그 자체에 초점을 잃고 있습니다. 분명히, 이것들은 내 의도가 아니 었습니다. 다른 음악 플레이어가 포커스를 요청했을 때 호출되기를 원했습니다.

private OnAudioFocusChangeListener focusChangeListener = new OnAudioFocusChangeListener() { 
    @Override 
    public void onAudioFocusChange(int focusChange) { 
     switch (focusChange) { 
     case AudioManager.AUDIOFOCUS_LOSS: 

      if (mPlayer.isPlaying()) { 
       stopPlayback(); 
      } 
      break; 
     case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: 
      if (mPlayer.isPlaying()) { 
       mPlayer.pause(); 
      } 
      break; 
     case AudioManager.AUDIOFOCUS_GAIN: 
      if (!mPlayer.isPlaying()) { 
       initiatePlayback(); 
      } 
      break; 
     } 
    } 
}; 

내가지고 있다고 하나 더 문제, 예외가있다 IllegalStateException입니다.

이것은 코드가 case AudioManager.AUDIOFOCUS_LOSS에 도달하면 내 뮤직 플레이어가 잘못된 상태임을 의미합니다. 그래서를 확인하기 위해, 내가 사용 OnErrorListener 등록 :

//Inside Service - onCreate() Method 
mPlayer.setOnErrorListener(mErrorListener); 

을하지만이 리스너가 호출되지 가져옵니다 않습니다. 도움이 필요하시면 알려드립니다.

답변

1

불행히도 IllegalStateExceptions는 OnErrorListener 호출을 트리거하지 않습니다. IllegalStateExceptions가 트리거 될 수있는 코드 부분을 시도하거나 catch해야합니다.

5

비슷한 문제가있어서 focusChangeListener의 다른 인스턴스에 초점을 요청할 수 있도록 귀하의 focusChangeListener이 프로그램의 어딘가에 재현 된 것으로 의심됩니다. 당신은 서비스 또는 활동에서 그것을 정의하고 있습니까?

아이디어는 단일 복사본이 requestAudioFocus()abandonAudioFocus()에 전달하여 focusChangeListener을 유지하는 것입니다; 그렇지 않으면 AudioManager가 다른 소스의 요청을 고려하므로 앱이 자체 포커스를 잃을 수 있습니다.

는 동일한 리스너 객체 여러 번에 requestAudioFocus()를 호출 한 번만 및 호출 abandonAudioFocus() 한 번 오디오 초점을 해제하기에 충분 그것을 등록 않는다는 것을 알아야한다. 문제를 해결할 수

몇 가지 제안 :

  • 봅니다 focusChangeListener 정적 객체를 정의하고 도움이되는지 확인합니다.

  • 청취자가 활동에 등록 된 경우 청취자가 보다 오래 지속될 수 있도록 서비스로 이동하는 것을 고려하십시오.

  • 이 문제를 디버깅하기 위해서는 로그인하는 데 많은 도움이 될 것입니다 다음 ** 당신이 요청하거나 같은 예를 다루고 있음을 보장하기 위해, 당신은이 있는지 확인하기 위해 초점을 포기 ** 때마다 :

    • 귀하의 focusChangeListener 예 focusChangeListener.hashCode()
    • 현재 컨텍스트 개체.context.hashCode()
    • 현재 스레드 ID 예 :

Thread.currentThread().getId() :

Log.d(TAG, String.format("Request audio focus: thread id = %s, context = %s, listener = %s",Thread.currentThread().getId(),context.hashCode(),focusChangeListener hashCode()) 

편집 :

뿐만 아니라 문제를 해결할 수있는 애플리케이션 컨텍스트 즉 getApplicationContext() 사용.

+0

focusChangeListener의 단일 복사본을 유지 관리하는 방법 ?? 나는 싱글 톤을 사용하지만, 활동 전환 플레이어가 그 초점 손실을 막을 수 있습니다 ... 당신이 나를 도울 수 ... – Sachin