2014-10-16 2 views
11

나는 브로드 캐스트 리시버 (전화 상태 리스너)에 다음 코드를 사용하고 방해한다. 전화가 끊어지면 스피커폰을 끕니다.사용 AudioManager는 스피커폰을 사용하려면 전화 오디오

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
audioManager.setMode(AudioManager.MODE_NORMAL); 
audioManager.setSpeakerphoneOn(false); 

이 모든 것이 잘 작동하는 것 같습니다 ... 처음입니다. 그 후에, 내 전화기의 오디오 스트림이 혼란에 빠져있는 것처럼 보입니다. 후속 호출은 이상하게 침묵하며 심지어 위의 설정이 실행되지 않는 앱 코드 외부에서 만들어진 호출입니다. 겉으로보기에 무작위로 전화 오디오를받을 수는 있지만 무엇이 돌아 오는지는 확실하지 않습니다.

내가 잘못하고있는 것에 대한 아이디어가 있습니까? 내가 모르는 안드로이드 버그가 있습니까? 후속 통화에 대해 내 음성을 끄지 않으려면 어떻게합니까?

편집 : 갤럭시 S4에서 테스트 중입니다.

답변

2

교체 실제로 있는지 알고 도움이 될 것입니다. 그것은 내 오디오를 망쳐 된 코드가이 줄을이었다 보인다 나는 그것없이 성공적으로 관여 할 수있는 스피커폰 설정을 가져올 수 없습니다 때문에이 방법을 사용했다

audioManager.setMode(AudioManager.MODE_IN_CALL); 

(나는의 모드를 설정하는 제안을 발견 또 다른 스택 오버플로 응답 ... 그것은 효과가 있었지만 문제가있는 결과가있었습니다.)

정말이 줄을 제거하고 500에서 2000으로 처리기 지연을 늘려야했습니다.

this answer에서 제안 된대로 AudioManager에 대한 정적 참조가 유지되었습니다. 이 특별한 경우에는 필요하지 않지만 미안한 것보다 안전합니다.

1

, 난 그냥 당신이 계정으로 발생하는 확인하기 위해, setMode의 documentation에서이 텍스트를 복사합니다 첫째 : 시스템 만 UNE 응용 프로그램과 함께 놀겠다는 거해야 즉

The audio mode encompasses audio routing AND the behavior of the telephony layer. 
Therefore this method should only be used by applications that replace the platform-wide 
management of audio settings or the main telephony application 

이런 종류의 방법. 그렇지 않으면 일관성이 보장되지 않습니다.

그런 다음 너무 낮 으면 (STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING, STREAM_MUSIC 또는 STREAM_ALARM) 다른 오디오 스트림을 확인합니다. 그리고 아마도 setSpeakerphoneOn 대신에 setStreamMute을 사용해보십시오.

당신의 어플은이 문제를 해결 한 the platform-wide management of audio settings or the main telephony application

+0

답변 해 주셔서 감사합니다. 내 자신의 문제를 해결하는 동안 귀하의 대답은 올바른 방향으로 나를 자극했습니다. 잘 했어. –

관련 문제