我有两个服务:第一个有蓝牙的记录,但在第二个我想通过麦克风输入录制语音,如果蓝牙一直打开,我该怎么办?感谢。
我已经尝试了
am = (AudioManager) getSystemService(AUDIO_SERVICE);
am.setBluetoothScoOn(false);
am.stopBluetoothSco();
am.setMicrophoneMute(false);
但如果蓝牙处于开启状态,则不会通过麦克风录制。
答案 0 :(得分:0)
可能无法实现这种方式可以保证适用于所有/大多数设备和Android版本。但是你可以尝试一些事情:
使用CAMCORDER
AudioSource。至少在某些设备上,这将使其中一个内置麦克风的优先级高于BT麦克风。应该注意的是,使用CAMCORDER
可能会导致麦克风被调整为远场录制(记录距离几米远的东西),如果你真的想要近距离拍摄,这可能是一个问题。现场录音。
告诉AudioPolicyManager
即使你启用了BluetoothSco,也不要让它用于录制:
Class<?> audioSystemClass = Class.forName("android.media.AudioSystem");
Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);
// 2 == FOR_RECORD, 0 == FORCE_NONE
setForceUse.invoke(null, 2, 0);
由于AudioPolicyManager
的实现在供应商之间有所不同,因此无法保证每个实现都会将此视为不使用BT麦克风进行录制的提示。
答案 1 :(得分:0)
要在蓝牙设备连接时从手机麦克风录制你只需设置一个标志(Swith)如果Flag不是设置(关闭)不要registerReceiver只是调用正常的startRecord()方法。当标志为SET时,表示通过注册BroadcastReceiver从蓝牙耳机录制并在onReceive()内部检查AudioManager状态并开始录制。
以下代码可能会对您有所帮助。
录制按钮
这里蓝牙是标志变量(开关)
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
if (bluetooth.isChecked()) {
Toast.makeText(getApplicationContext(), "Bluetooth Recording",
Toast.LENGTH_SHORT).show();
Register();
} else {
Toast.makeText(getApplicationContext(), "Normal Recording",
Toast.LENGTH_SHORT).show();
Normal();
}
}
});
**正常录音(手机麦克风)即使蓝牙开启**
protected void Normal() {
// TODO Auto-generated method stub
if (!mIsRecording) {
button.setText(stopRecordingLabel);
mIsRecording = true;
mRecorder.startRecording();
mRecording = getFile("raw");
startBufferedWrite(mRecording);
} else {
button.setText(startRecordingLabel);
mIsRecording = false;
mRecorder.stop();
File waveFile = getFile("wav");
try {
rawToWave(mRecording, waveFile);
} catch (IOException e) {
Toast.makeText(Mediarec.this, e.getMessage(),
Toast.LENGTH_SHORT).show();
}
Toast.makeText(Mediarec.this, "Recorded to " + waveFile.getName(),
Toast.LENGTH_SHORT).show();
}
}
**从蓝牙设备录制 当设备连接时,您将获得回叫
protected void Register() {
// TODO Auto-generated method stub
am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(Mediarec.this, "Inside rcv " ,
Toast.LENGTH_SHORT).show();
int state = intent.getIntExtra(
AudioManager.EXTRA_SCO_AUDIO_STATE, -1);
Log.d("Tag", "Audio SCO state: " + state);
if (AudioManager.SCO_AUDIO_STATE_CONNECTED == state) {
/*
* Now the connection has been established to the */bluetooth
Toast.makeText(getApplicationContext(), "Inside onrecive",
Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "Inside onrecive",
Toast.LENGTH_SHORT).show();
if (!mIsRecording) {
button.setText(stopRecordingLabel);
mIsRecording = true;
mRecorder.startRecording();
mRecording = getFile("raw");
startBufferedWrite(mRecording);
} else {
button.setText(startRecordingLabel);
mIsRecording = false;
mRecorder.stop();
File waveFile = getFile("wav");
try {
rawToWave(mRecording, waveFile);
} catch (IOException e) {
Toast.makeText(Mediarec.this, e.getMessage(),
Toast.LENGTH_SHORT).show();
}
Toast.makeText(Mediarec.this,
"Recorded to " + waveFile.getName(),
Toast.LENGTH_SHORT).show();
}
unregisterReceiver(this);
am.stopBluetoothSco();
}
}
}, new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED));
Log.d("Start Bluetooth", "starting bluetooth");
am.startBluetoothSco();
}