我正嘗試從與Android設備配對的藍牙耳機捕獲音頻。通過與Android設備配對的藍牙耳機捕獲音頻
以下是相關代碼:
Intent in=null;
final int bufferSize=BufferElements2Rec*BytesPerElement;
final BroadcastReceiver brr=new BroadcastReceiver()
{
@Override
public void onReceive(Context context,Intent intent)
{
int state=intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE,-1);
Log.d(labelApp,"Audio SCO State = "+state);
if(AudioManager.SCO_AUDIO_STATE_CONNECTED==state)
{
Log.d(labelApp,"Entered and Starting Recording");
//recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,
// RECORDER_SAMPLERATE, RECORDER_CHANNELS,
// RECORDER_AUDIO_ENCODING, bufferSize);
recorder = new AudioRecord(android.media.MediaRecorder.AudioSource.MIC,
RECORDER_SAMPLERATE, RECORDER_CHANNELS,
RECORDER_AUDIO_ENCODING, bufferSize);
if(recorder==null)
{
Log.d(labelApp,"null");
}
else
{
Log.d(labelApp,"not null");
}
recorder.startRecording();
recordingThread=new Thread(new Runnable()
{
@Override
public void run() {
// TODO Auto-generated method stub
writeAudioDataToFile();
}
},"AudioRecorder Thread");
recordingThread.start();
Log.d(labelApp,"Launched Recording Thread");
}
}
};
try
{
Log.d(labelApp,"Initializing BT");
am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
//am.setMode(AudioManager.MODE_IN_CALL);
//in=registerReceiver(brr,new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED));
//in=registerReceiver(brr,new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED));
Log.d(labelApp,"Starting Bluetooth");
am.setStreamSolo(AudioManager.MODE_IN_CALL, true);
am.setBluetoothScoOn(true);
am.setMode(AudioManager.MODE_IN_CALL);
am.startBluetoothSco();
Log.d(labelApp,"Can BT record from mic? "+am.isBluetoothScoAvailableOffCall());
//in=registerReceiver(brr,new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED));
in=registerReceiver(brr,new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED));
// The following line makes the audio go to hell
//am.setMode(AudioManager.MODE_IN_CALL);
//am.setStreamSolo(AudioManager.MODE_IN_CALL, true);
Log.d(labelApp,"Everything initializated");
Log.d(labelApp,"Recorder is...");
}
catch(Exception e)
{
Log.e(labelApp,"exception",e);
writeStack(e);
}
try
{
Log.d(labelApp,"Initializing BT");
am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
//am.setMode(AudioManager.MODE_IN_CALL);
//in=registerReceiver(brr,new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED));
//in=registerReceiver(brr,new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED));
Log.d(labelApp,"Starting Bluetooth");
am.setStreamSolo(AudioManager.MODE_IN_CALL, true);
am.setBluetoothScoOn(true);
am.setMode(AudioManager.MODE_IN_CALL);
am.startBluetoothSco();
Log.d(labelApp,"Can BT record from mic? "+am.isBluetoothScoAvailableOffCall());
//in=registerReceiver(brr,new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED));
in=registerReceiver(brr,new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED));
// The following line makes the audio go to hell
//am.setMode(AudioManager.MODE_IN_CALL);
//am.setStreamSolo(AudioManager.MODE_IN_CALL, true);
Log.d(labelApp,"Everything initializated");
Log.d(labelApp,"Recorder is...");
}
catch(Exception e)
{
Log.e(labelApp,"exception",e);
writeStack(e);
}
艙單問權限:
- WRITE_EXTERNAL_STORAGE
- RECORD_AUDIO
- INTERNET
- 許可權
- BROADCAST_S TICKY
- 藍牙
- BLUETOOTH_ADMIN
每個應用程序的典型過濾logcat的輸出是:
- 初始化BT
- 啓動藍牙
- 可以從話筒BT記錄?真正
- 一切初始化
- Recorder是...
- 音頻SCO狀態= 2
- 音頻SCO狀態= 1
- 進入並開始記錄
- 沒有空
- 推出記錄線程
當am.startBluetoothSco();被調用,我可以聽到BT設備上的短暫噪音,但是該應用只是從Android設備的麥克風取代BT的音頻。
任何暗示我錯過/做錯了什麼?
預先感謝關注
嗨,我在這麼長時間後也遇到過這個問題,你能告訴我如何解決它嗎?謝謝。 – mmm2006