Trong vài ngày qua, tôi đã cố gắng phát bất kỳ âm thanh nào qua tai nghe bluetooth sco của mình từ điện thoại Android của mình. Mục tiêu cuối cùng của tôi với dự án này là cuối cùng làm cho một cái mở cửa nhà để xe, nhưng trước tiên tôi cần để có thể chơi âm thanh qua tai nghe.Android: Phát âm thanh qua tai nghe Bluetooth Sco
Đây là căn cứ vào mã hiện tại tôi đang sử dụng:
==Manifest==
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
==Code==
audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.startBluetoothSco();
audioManager.setBluetoothScoOn(true);
short[] soundData = new short [8000*20];
for (int iii = 0; iii < 20*8000; iii++) {
soundData[iii] = 32767;
iii++;
soundData[iii] = -32768;
}
audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
8000, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, soundData.length
* Short.SIZE, AudioTrack.MODE_STATIC);
audioTrack.write(soundData, 0, soundData.length);
audioTrack.play();
Trước khi tôi chạy này, tôi cặp tai nghe bluetooth của tôi để điện thoại của tôi và có nó được kết nối. Tôi đã xác minh nó hoạt động bằng cách gọi thư thoại của tôi. Tuy nhiên, khi tôi chạy mã của mình, không có âm thanh phát ra từ bất cứ đâu.
Dưới đây là những ảnh hưởng của các dòng khác nhau của mã:
Khi Tôi chỉ chạy ứng dụng của tôi:
audioManager.setMode(AudioManager.MODE_IN_CALL);
Dòng này làm cho tất cả các điểm dừng âm thanh của tôi làm việc không có vấn đề gì tôi làm, vì vậy nó thường được bình luận.
audioManager.startBluetoothSco();
audioManager.setBluetoothScoOn(true);
Hai dòng này làm cho âm thanh dừng ra khỏi loa trước và làm cho tai nghe của tôi nhấp và bật như đã bật nhưng không có đầu ra.
AudioManager.STREAM_VOICE_CALL
Đây là một phần của cuộc gọi của tôi với công cụ xây dựng AudioTrack, nhưng nó tạo nên sự khác biệt. Vì điều này được đặt thành STREAM_VOICE_CALL âm thanh xuất phát từ loa phía trước, nếu tôi đặt nó thành STREAM_MUSIC, âm thanh sẽ phát ra loa sau.
Khi tôi mở ứng dụng của tôi trong khi gọi:
audioManager.setMode(AudioManager.MODE_IN_CALL);
Trong khi gọi, dòng này không có tác dụng vì MODE_IN_CALL đã được thiết lập. Nhưng những gì khác nhau tuy nhiên là âm thanh của tôi được trộn lẫn với các cuộc gọi điện thoại, trong khi bình thường nó không chơi ở tất cả.
audioManager.startBluetoothSco();
audioManager.setBluetoothScoOn(true);
Điều này, với phần đối tác của chúng giảm đi một nửa, kiểm soát âm thanh đến từ đâu. Nếu tôi tắt chúng, âm thanh của tôi và cuộc gọi điện thoại đến từ loa phía trước, với những âm thanh này, cuộc gọi điện thoại đến từ tai nghe của tôi và âm thanh của tôi bị mất.
Vì sao mã của tôi không hoạt động, tôi thành thật không biết. Tôi tin rằng tôi đã hoàn thành danh sách kiểm tra để sử dụng startBluetoothSco().
Even if a SCO connection is established, the following restrictions
apply on audio output streams so that they can be routed to SCO headset:
- the stream type must be STREAM_VOICE_CALL - the format must be mono -
the sampling must be 16kHz or 8kHz
Vì vậy, có ai có ý tưởng về những gì tôi đang làm sai không? Có một lần tôi cố gắng phát âm thanh qua tai nghe, nhưng đó chỉ là một giai điệu ngắn khi tôi quên dừng() AudioTrack của tôi vì vậy tôi phải cho rằng đó là một trục trặc.
Bạn đã đặt AudioManager.MODE_NORMAL ở đâu trong mã này? – RedBullet