2014-10-16 21 views
11

Tôi đang sử dụng đoạn mã sau vào một BroadcastReceiver (nghe nhà nước điện thoại) để kích hoạt loa ngoài:Sử dụng AudioManager can thiệp với âm thanh cuộc gọi

final Handler mHandler = new Handler(); 
mHandler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 
     audioManager.setMode(AudioManager.MODE_IN_CALL); 
     audioManager.setSpeakerphoneOn(true); 
    } 
}, 500); 

Điều này xảy ra khi một cuộc gọi đi mới được tiến hành thông qua ứng dụng của tôi. Khi cuộc gọi bị ngắt kết nối, tôi tắt loa ngoài:

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

Điều này dường như hoạt động tốt ... lần đầu tiên. Sau đó, các dòng âm thanh của điện thoại của tôi dường như bị rối tung thành một mớ hỗn độn. Các cuộc gọi tiếp theo là im lặng lạ thường, ngay cả các cuộc gọi được thực hiện từ bên ngoài mã của ứng dụng của tôi (nơi các cài đặt ở trên không được kích hoạt). Tôi có thể nhận được âm thanh cuộc gọi trở lại dường như ngẫu nhiên, nhưng tôi không chắc chắn những gì làm cho nó trở lại.

Bất kỳ ý tưởng nào về những gì tôi có thể làm sai? Có lỗi Android nào mà tôi không biết? Làm cách nào để tránh im lặng âm thanh của tôi cho các cuộc gọi tiếp theo?

EDIT: Tôi đang thử nghiệm trên Galaxy S4.

Trả lời

2

tôi đã giải quyết được vấn đề này. Có vẻ như các mã đã được điều chỉnh các âm thanh của tôi là dòng này:

audioManager.setMode(AudioManager.MODE_IN_CALL); 

tôi đã sử dụng phương pháp này bởi vì tôi không thể có được các thiết lập loa để thu hút thành công mà không có nó (Tôi tìm thấy một gợi ý để thiết lập các chế độ trong một Stack Overflow câu trả lời ... nó đã làm việc, nhưng có hậu quả có vấn đề).

Tất cả những gì tôi thực sự phải làm là xóa dòng này và tăng độ trễ của trình xử lý từ 500 đến 2000.

Tôi cũng đã duy trì tham chiếu tĩnh cho Trình quản lý âm thanh như được đề xuất trong this answer. Nó không có vẻ là cần thiết trong trường hợp đặc biệt này, nhưng tốt hơn là an toàn hơn xin lỗi.

1

Trước, tôi sẽ sao chép văn bản này từ documentation của setMode, chỉ để đảm bảo bạn đang gặp nó vào tài khoản:

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 

Nói cách khác, chỉ đơn une trên hệ thống nên được đùa giỡn với loại phương pháp này. Nếu được thực hiện khác, tính nhất quán không được đảm bảo.

Sau đó, tôi sẽ kiểm tra các luồng âm thanh khác nhau trong trường hợp bạn có một số kênh quá thấp (STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING, STREAM_MUSIC hoặc STREAM_ALARM). Và có thể thử sử dụng setStreamMute thay vì setSpeakerphoneOn.

Nó sẽ rất hữu ích để biết nếu ứng dụng của bạn là trong thực tế thay thế the platform-wide management of audio settings or the main telephony application

+0

Cảm ơn câu trả lời của bạn. Trong khi tôi kết thúc giải quyết vấn đề của riêng tôi, câu trả lời của bạn thúc đẩy tôi đi đúng hướng. Làm tốt lắm. –

Các vấn đề liên quan