【问题标题】:Unable to record Audio via Bluetooth in Android无法在 Android 中通过蓝牙录制音频
【发布时间】:2013-06-07 11:56:37
【问题描述】:

我正在编写一个用于从蓝牙录制音频的 Android 应用程序,但我无法在 Android 中通过蓝牙录制音频。 你可以看到下面的代码

AudioManager am;
am = (AudioManager) getSystemService(AUDIO_SERVICE);
     am.setMode(AudioManager.MODE_IN_CALL);
     am.startBluetoothSco();
     am.setBluetoothScoOn(true);
    Intent intent = getIntent();
 if (intent.getBooleanExtra("privacy", false)) {
        showServerPrompt(true);
        return;
    }

    // If the Ringdroid media select activity was launched via a
    // GET_CONTENT intent, then we shouldn't display a "saved"
    // message when the user saves, we should just return whatever
    // they create.
    mWasGetContentIntent = intent.getBooleanExtra(
        "was_get_content_intent", false);

    mFilename = intent.getData().toString();

    mSoundFile = null;
    mKeyDown = false;

    if (mFilename.equals("record")) {
        try {Intent recordIntent = new Intent(
                MediaStore.Audio.Media.RECORD_SOUND_ACTION);
            startActivityForResult(recordIntent, REQUEST_CODE_RECORD);

        } catch (Exception e) {
            showFinalAlert(e, R.string.record_error);
        }

    }

    mHandler = new Handler();

    loadGui();

    mHandler.postDelayed(mTimerRunnable, 100);

    if (!mFilename.equals("record")) {
        loadFromFile();
    }
}

这在以正常方式使用手机时效果很好。但是,它不会检测到蓝牙耳机的存在,并且即使在耳机插入时仍然使用手机自带的麦克风。

【问题讨论】:

    标签: android android-intent bluetooth broadcastreceiver audio-recording


    【解决方案1】:

    下面的工作代码

    am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    
    registerReceiver(new BroadcastReceiver() {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            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 device. 
                 * Record audio or whatever (on another thread).With AudioRecord you can record with an object created like this:
                 * new AudioRecord(MediaRecorder.AudioSource.MIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
                 * AudioFormat.ENCODING_PCM_16BIT, audioBufferSize);
                 *
                 * After finishing, don't forget to unregister this receiver and
                 * to stop the bluetooth connection with am.stopBluetoothSco();
                 */
                unregisterReceiver(this);
            }
    
        }
    }, new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED));
    
    Log.d(TAG, "starting bluetooth");
    am.startBluetoothSco();
    

    【讨论】:

    • 这可行,但值得一提的是,它需要以下权限:BLUETOOTH、MODIFY_AUDIO_SETTINGS 和 BROADCAST_STICKY。
    猜你喜欢
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多