蓝牙开启时强制麦克风输入

时间:2014-05-06 08:58:58

标签: android bluetooth

我有两个服务:第一个有蓝牙的记录,但在第二个我想通过麦克风输入录制语音,如果蓝牙一直打开,我该怎么办?感谢。

我已经尝试了

 am = (AudioManager) getSystemService(AUDIO_SERVICE);

 am.setBluetoothScoOn(false);
 am.stopBluetoothSco(); 
 am.setMicrophoneMute(false);

但如果蓝牙处于开启状态,则不会通过麦克风录制。

2 个答案:

答案 0 :(得分:0)

可能无法实现这种方式可以保证适用于所有/大多数设备和Android版本。但是你可以尝试一些事情:

  1. 使用CAMCORDER AudioSource。至少在某些设备上,这将使其中一个内置麦克风的优先级高于BT麦克风。应该注意的是,使用CAMCORDER可能会导致麦克风被调整为远场录制(记录距离几米远的东西),如果你真的想要近距离拍摄,这可能是一个问题。现场录音。

  2. 告诉AudioPolicyManager即使你启用了BluetoothSco,也不要让它用于录制:

  3.  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();

}