2010-05-25 4 views
2

Froyo에서 Intent.ACTION_MEDIA_BUTTON을 처리하는 올바른 (새로운) 접근법을 알아 내려고하고 있습니다. 2.2 일 전까지는 BroadcastReceiver (영구적으로 또는 런타임에)를 등록해야했고 다른 응용 프로그램을 가로 채고 방송을 중단하지 않는 한 Media Button 이벤트가 도착했습니다.안드로이드 2.2에서 헤드셋과 블루투스 AVRC 전송 컨트롤을 다루기위한 가이드 라인

Froyo는 여전히 (적어도 유선 헤드셋의 경우) 해당 모델을 다소 지원하는 것처럼 보이지만 응용 프로그램 간의 "전송 포커스"를 제어하는 ​​것으로 보이는 registerMediaButtonEventReceiver 및 unregisterMediaButtonEventReceiver 메서드도 소개합니다.

내 실험 중에는 registerMediaButtonEventReceiver를 사용하면 블루투스와 유선 헤드셋 단추를 눌러 응용 프로그램의 브로드 캐스트 수신기로 라우팅 할 수 있지만 (응용 프로그램에서 "전송 포커스"를 얻음) 오디오 라우팅이 변경된 것 같습니다 (예 : 헤드셋 연결 해제) 포커스를 기본 미디어 플레이어로 되돌려 놓습니다.

Android 2.2의 구현에 대한 논리는 무엇입니까? 운송 통제를 처리하는 올바른 방법은 무엇입니까? 오디오 라우팅의 변화를 감지하고 포커스를 다시 얻으려고합니까?

이것은 Android 플랫폼의 모든 타사 미디어 플레이어가 처리해야하는 문제이므로 누군가 (Google 엔지니어 일 가능성이 있음)가 우리가 따라야 할 지침을 제공 할 수 있기를 바랍니다. 표준 접근법을 사용하면 최종 사용자가 헤드셋 버튼 컨트롤을 예측할 수있게됩니다. 스테판

답변

1

몇 가지 실험 후, 나는 안드로이드 2.2의 새로운 교통 및 오디오 초점 인프라 작업 솔루션을 얻을 수있었습니다.

내가 끝낼 때마다 응용 프로그램 재생이 시작될 때마다 Audio Focus (AudioManager.requestAudioFocus 사용)와 Trasport Focus (AudioManagter.registerMediaButtonEventReceiver 사용)를 모두 요청하는 것입니다.

requestAudioFocus는 오디오 포커스가 사용자에게서 멀어지면 호출되는 콜백을 사용합니다 (예 : 내부 플레이어가 재생을 시작 함). 제 경우에는 초점이 영구히 취해지면 응용 프로그램에서 재생을 일시 중지합니다. 같은 콜백은 이제 초점이 일시적으로 만 수행되었다는 것을 알려줍니다 (예 : Nav 시스템이 말하는 중). 따라서 재생을 "멈추거나"볼륨을 낮추거나 말한 후 일시 중지했다가 다시 시작합니다.

나머지 문제는 Bluetooth 헤드셋을 연결할 때마다 내장 음악 플레이어가 전송 포커스를 사용한다는 것입니다. 이 기능은 헤드폰을 연결 한 후 헤드셋의 재생 버튼을 처음 누르면 기본 음악 플레이어에서 항상 재생을 시작하는 효과가 있습니다.

헤드셋 연결을 감지하고 전송 포커스를 "도용"하는 방법이있을 수 있습니다. 필자는 기본 플레이어와 "싸우지"않기로 결정하고 사용자가 응용 프로그램에서 수동으로 재생을 시작할 때 전송 포커스를 되돌려 놓습니다.

누군가가 더 많은 통찰력을 가지거나 전송/오디오 포커스를 더 잘 처리하는 방법을 알고 있다면 공유하십시오.

0

또한 미디어 버튼 등록이 같은 문제가 있습니다.

주기적으로 Android는 미디어 버튼 등록을 기본 음악 플레이어에 반환합니다. 나는 이유를 알아낼 수 없었다. 응용 프로그램 재생이 일시 중지되는 동안뿐만 아니라 응용 프로그램이 활발하게 재생되는 동안이 문제가 발생할 수 있습니다.

블루투스 일시 중지 및 재생 제어 단추가 주기적으로 내 응용 프로그램을 제어하기 위해 작동하지 않는다고 불평 한 사용자가 2 초마다 registerMediaButtonEventReceiver를 호출하여 응용 프로그램을 다시 등록하는 코드를 구현했습니다. 이렇게하면 버튼 등록을 다시받을 수 있으며 대부분 사용자가 Bluetooth 미디어 버튼을 누르고 기본 미디어 플레이어가 응답하는 시간 창을 피할 수 있습니다.

내 응용 프로그램은이 전체 기간 동안 오디오 포커스를 유지하지만 오디오 포커스가있는 동안 블루투스 단추 이벤트가 주기적으로 손실됩니다. 내 응용 프로그램은 오디오 포커스가 손실되었다는 알림을 받으면 미디어 단추 이벤트 수신기의 등록을 항상 취소하고 임시 오디오 포커스 손실이 오디오 포커스를 반환 할 때 나중에 호출되는 경우 다시 등록합니다.

2 초 타이머를 계속 실행하고 다시 등록하는 작업이 효과적 이었지만 누군가가 미디어 버튼 등록을 주기적으로 다시 전환하면이 2 초 타이머를 없애고 싶습니다. 기본 미디어 플레이어

+1

registerMediaButtonEventReceiver를 호출 할 때마다 기본 미디어 플레이어가 등록에서 앱을 가져 오는 경우를 포착하는 ACTION_AUDIO_BECOMING_NOISY 이벤트가 발생할 때마다 발견했습니다. 또한 abortBroadcast()를 호출하여 다른 응용 프로그램이 나에게이 이벤트를받지 못하게 한 다음 다시 방금 등록한 후에 미디어 버튼을 잡아 끌 필요가있었습니다. – skyhigh