2010-01-27 46 views
38

Tôi có tai nghe BT không phải là tai nghe A2DP (Plantronics 510) và muốn sử dụng nó với Android HTC Magic để nghe âm thanh chất lượng thấp như podcast/âm thanh sách.Định tuyến âm thanh sang Tai nghe Bluetooth (không A2DP) trên Android

Sau nhiều lần googling tôi thấy rằng chỉ có thể chuyển âm thanh cuộc gọi điện thoại đến tai nghe BT không A2DP. (Tôi muốn biết nếu bạn đã tìm thấy giải pháp sẵn sàng để định tuyến tất cả các loại âm thanh đến tai nghe BT không A2DP)

Vì vậy, tôi đã lập trình bằng âm thanh cho luồng mang âm thanh cuộc gọi điện thoại. Bằng cách này tôi sẽ đánh lừa điện thoại để mang âm thanh mp3 của tôi đến tai nghe BT của tôi. Tôi đã viết theo mã đơn giản.

import android.content.*; 
import android.app.Activity; 
import android.os.Bundle; 
import android.media.*; 
import java.io.*; 
import android.util.Log; 

public class BTAudioActivity extends Activity 
{ 
    private static final String TAG = "BTAudioActivity"; 

    private MediaPlayer mPlayer = null; 
    private AudioManager amanager = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     amanager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     amanager.setBluetoothScoOn(true); 
     amanager.setMode(AudioManager.MODE_IN_CALL); 

     mPlayer = new MediaPlayer(); 

     try { 
      mPlayer.setDataSource(new FileInputStream(
       "/sdcard/sample.mp3").getFD()); 

      mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 

      mPlayer.prepare(); 

      mPlayer.start(); 
     } catch(Exception e) { 
      Log.e(TAG, e.toString()); 
     } 
    } 

    @Override 
    public void onDestroy() 
    { 
     mPlayer.stop(); 
     amanager.setMode(AudioManager.MODE_NORMAL); 
     amanager.setBluetoothScoOn(false); 
     super.onDestroy(); 
    } 
} 

Như bạn có thể thấy tôi đã cố gắng kết hợp các phương pháp khác nhau mà tôi nghĩ sẽ đánh lừa điện thoại để tin rằng âm thanh của tôi là một cú điện thoại:

  • Sử dụng setAudioStreamType MediaPlayer của (STREAM_VOICE_CALL)
  • sử dụng AudioManager của setBluetoothScoOn (đúng)
  • sử dụng bộ mã hóa của AudioManager (MODE_IN_CALL)

Nhưng không có điều nào ở trên hiệu quả. Nếu tôi loại bỏ các cuộc gọi AudioManager trong đoạn mã trên, âm thanh phát từ loa và nếu tôi thay thế chúng như được hiển thị ở trên thì âm thanh sẽ ngừng phát ra từ loa nhưng nó không đi qua tai nghe BT. Vì vậy, điều này có thể là một phần thành công.

Tôi đã kiểm tra xem tai nghe BT có hoạt động tốt với các cuộc gọi điện thoại không.

Phải có lý do để Android không hỗ trợ tính năng này. Nhưng tôi không thể buông bỏ cảm giác rằng không thể định tuyến lại âm thanh một cách có lập trình. Bất kỳ ý tưởng?

P.S. trên mã cần sau phép

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

+0

Bạn có thể không cần tự viết mã. Đơn giản chỉ cần cài đặt một ứng dụng miễn phí được thiết kế để làm những gì bạn muốn. Xem câu hỏi Android.SE: ["Có thể hướng tất cả đầu ra âm thanh, bao gồm đầu ra âm nhạc, đến tai nghe Bluetooth không?"] (Http://android.stackexchange.com/questions/19336/is-it-possible- để-trực tiếp-tất cả-âm thanh-đầu ra-to-a-bluetooth-tai nghe) Tôi đã thử một vài ứng dụng khác nhau. Cuối cùng, "Mono Bluetooth Router" là người duy nhất làm việc cho tôi. – unforgettableid

Trả lời

2

Nên có một con đường tuyến đường ALSA cấu hình cho máy nghe nhạc Media, để nó có thể mở ra một con đường âm thanh khác nhau và sau đó tuyến đường âm thanh để BT tai nghe.

13

Chủ đề này có thể đã chết lâu nhưng đối với những người có thể đang thử cùng một điều, một số ghi chú từ tài liệu AudioManager có thể hữu ích. Có vẻ như phần tử bị thiếu là lệnh startBluetoothSco() nhưng có những hạn chế về việc sử dụng kênh này. Từ trang web Android Dev here:

public void startBluetoothSco() Kể từ: API Cấp 8 Bắt đầu bluetooth SCO kết nối âm thanh.

Yêu cầu quyền: MODIFY_AUDIO_SETTINGS.

Phương pháp này có thể được sử dụng bởi các ứng dụng muốn gửi và nhận âm thanh đến/từ một bluetooth SCO tai nghe trong khi điện thoại không có trong gọi.

Khi thiết lập kết nối SCO có thể mất vài giây, các ứng dụng không nên dựa vào các kết nối đến có sẵn khi phương thức trả về nhưng thay vì đăng ký để nhận được ý định ACTION_SCO_AUDIO_STATE_CHANGED và chờ đợi nhà nước là SCO_AUDIO_STATE_CONNECTED.

Vì kết nối không được đảm bảo thành công , ứng dụng phải chờ mục đích này với thời gian chờ.

Khi hoàn tất với kết nối SCO hoặc nếu thời gian thành lập ra, việc áp dụng phải gọi stopBluetoothSco() để xóa các yêu cầu và rẽ xuống bluetooth kết nối.

Thậm chí nếu một kết nối SCO được thành lập, hạn chế sau đây được áp dụng vào đầu ra âm thanh suối để họ có thể được chuyển đến SCO tai nghe: - loại dòng phải STREAM_VOICE_CALL - định dạng phải mono - lấy mẫu phải 16kHz hoặc 8kHz

các hạn chế sau đây áp dụng trên suối đầu vào: - định dạng phải mono - lấy mẫu phải 8kHz

Lưu ý rằng ứng dụng điện thoại luôn luôn có mức độ ưu tiên khi sử dụng kết nối SCO cho điện thoại. Nếu phương thức này được gọi trong khi điện thoại đang ở số , cuộc gọi đó sẽ bị bỏ qua. Tương tự, nếu cuộc gọi được nhận hoặc gửi trong khi ứng dụng đang sử dụng kết nối SCO , kết nối sẽ bị bị mất cho ứng dụng và KHÔNG tự động trả lại khi cuộc gọi kết thúc.

Xem Cũng stopBluetoothSco() ACTION_SCO_AUDIO_STATE_CHANGED

Lưu ý rằng tôi đã không kiểm tra này, tôi chỉ đi dọc theo một chỉ dẫn tôi tìm thấy trong nghiên cứu một dự án tương tự. Tôi nghĩ Jayesh đã gần với giải pháp và những hạn chế ở trên có thể là những gì khiến nó không hoạt động.

+0

Brilliant! Cảm ơn :) – Force

+0

startBluetoothSco() và

+0

Tôi đã thêm STREAM_VOICE_CALL này nhưng trong một số thiết bị samsung (Samsung S6) nó hoạt động và trên khác nó sẽ không hoạt động. Là chế độ khác của họ để ghi lại giọng nói từ chế độ bluetooth cho tất cả các thiết bị. Tôi cũng đã thử với MODE_IN_COMMUNICATION. –

5

Để bật:

localAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
localAudioManager.setMode(0); 
localAudioManager.setBluetoothScoOn(true); 
localAudioManager.startBluetoothSco(); 
localAudioManager.setMode(AudioManager.MODE_IN_CALL); 

Để tắt:

localAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
localAudioManager.setBluetoothScoOn(false); 
localAudioManager.stopBluetoothSco(); 
localAudioManager.setMode(AudioManager.MODE_NORMAL); 

I took it from here

3

vĩ đại làm việc nó đang làm việc tốt cho tôi xin làm thay đổi bit trong mã của bạn nó sẽ làm việc hoàn toàn tức là

mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 

to 

mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
+1

Cảm ơn Aditya, Công việc tuyệt vời ... –

0

Không thể nhìn thấy một ứng dụng làm việc được chấp nhận rõ ràng để đưa ra một câu trả lời mới. Ứng dụng này định tuyến âm nhạc và âm thanh đến tai nghe Không A2dp. Hãy thử ứng dụng của tôi và tìm mã nguồn cũng trong github cho mã tham chiếu.https://github.com/sauravpradhan/AnySound2BT

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