2010-01-27 132 views
38

我有一個非A2DP單耳耳機BT耳機(Plantronics 510),並希望將其與我的Android HTC Magic一起使用以收聽低質量音頻,如播客/音頻圖書。在Android上將音頻路由到藍牙耳機(非A2DP)

經過大量的谷歌搜索,我發現只有電話音頻可以路由到非A2DP BT耳機。 (我想知道如果你已經找到了一種現成的解決方案,將各種音頻路由到非A2DP BT耳機)

所以我想通過編程方式,我可以將音頻傳輸到攜帶電話音頻的流。這樣我就會騙過手機將我的mp3音頻傳送到我的BT耳機。我寫了以下簡單的代碼。

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(); 
    } 
} 

正如你可以看到我嘗試了,我認爲會愚弄手機相信我的聲音是電話呼叫的各種方法的結合:

  • 使用MediaPlayer的setAudioStreamType(STREAM_VOICE_CALL)
  • 使用AudioManager的setBluetoothScoOn(真)
  • 使用AudioManager的setMode(MODE_IN_CALL)

但以上都沒有工作。如果我在上面的代碼中刪除了AudioManager調用,則音頻將從揚聲器播放,如果我按照上圖所示更換它們,則音頻會停止來自揚聲器,但不會通過BT耳機傳送。所以這可能是部分成功。

我已經檢查過,BT耳機的工作方式可以與電話通話。

Android不支持這個原因。但我不能放棄以編程方式重新路由音頻的感覺。有任何想法嗎?

P.S.上面的代碼需要以下權限

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

+0

您可能不需要自己編寫任何代碼。只需安裝一個免費的應用程序,旨在做你想做的。請參閱Android.SE問題:[「是否可以將所有音頻輸出(包括音樂輸出)指向藍牙耳機?」](http://android.stackexchange.com/questions/19336/is-it-possible-直接所有音頻輸出到藍牙耳機)我嘗試了幾個不同的應用程序。最後,「單聲道藍牙路由器」是唯一一個爲我工作的人。 – unforgettableid 2015-07-01 00:41:47

回答

2

應該有配置爲媒體播放器ALSA路線路徑,以便它可以打開不同的音頻路徑,然後你的路線音頻藍牙耳機。

13

此線程可能已經很長時間了,但對於那些可能嘗試同樣的事情的人來說,AudioManager文檔中的一些筆記可能會有用。它看起來像缺少的元素是startBluetoothSco()命令,但是對此通道的使用存在限制。從Android開發網站here

公共無效startBluetoothSco()自:API等級8啓動藍牙SCO 音頻連接。

需要授權: MODIFY_AUDIO_SETTINGS。

這種方法可以通過 應用程序想要發送和接收 音頻/從藍牙SCO 耳機,而手機是不是在 調用中使用。

由於SCO連接建立 可能需要幾秒鐘,應用 不應該依賴的連接 上時可用該方法返回 而是註冊接收 意圖ACTION_SCO_AUDIO_STATE_CHANGED 和等待狀態爲 SCO_AUDIO_STATE_CONNECTED。

由於連接不能保證 成功,應用程序必須等待 這個意圖超時。

當與SCO連接 或者如果出了建立時間結束後, 應用程序必須調用 stopBluetoothSco()來清除 請求,並調低藍牙 連接。

即使SCO連接 成立,以下 限制適用於音頻輸出 流,使他們能夠被路由到 SCO耳機: - 流的類型必須是 STREAM_VOICE_CALL - 格式必須爲 單 - 取樣必須是16kHz的或 8kHz的

以下限制適用於 輸入流: - 格式必須是 單 - 採樣必須是8kHz的

請注意,電話應用始終 優先使用用於電話的 SCO連接。如果這個 方法被調用,而手機在 調用它將被忽略。類似地,如果 收到一個呼叫或發送在一個 應用程序正在使用SCO 連接,該連接將是 失去了應用和NOT 自動地返回了呼叫 結束時。

另請參見stopBluetoothSco() ACTION_SCO_AUDIO_STATE_CHANGED

請注意,我沒有測試過這一點,我只是沿着導線我在研究一個類似的項目中找到傳球。我認爲Jayesh接近解決方案,上面的限制可能是阻止它工作的原因。

+0

太棒了!謝謝:) – Force 2011-08-29 12:05:20

+0

startBluetoothSco()和 2012-10-16 15:17:45

+0

我已經添加了這個STREAM_VOICE_CALL,但在一些三星設備(三星S6)它的工作原理和其他它不會工作。他們是否有任何其他模式可以爲所有設備錄製來自藍牙模式的語音。我也嘗試過使用MODE_IN_COMMUNICATION。 – 2017-06-08 09:25:07

5

開啓:

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

要關閉:

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

I took it from here

3

偉大的工作,它正在對我很好,請做修改位在代碼中它會工作完美即

mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 

to 

mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
+1

感謝Aditya,很棒的工作...... – 2014-07-02 14:10:37

0

無法看到一個清晰的接受工作的應用程序,因此提出了一個新的答案。此應用程序將音樂和音頻路由到非A2dp耳機。試試我的應用程序,並在github中查找源代碼以獲取參考代碼。https://github.com/sauravpradhan/AnySound2BT

相關問題