2013-03-15 2 views
0

У меня есть Bluetooth-гарнитура (BTC6White). Я хочу говорить в микрофон, и устройство Android воспроизводит звук.Понимание соединения Bluetooth-гарнитуры с Android

Итак, как я могу это сделать? Во-первых, я могу установить гнездовое соединение

socket = mDevice.createRfcommSocketToServiceRecord(UUID.fromString("0000111e-0000-1000-8000-00805f9b34fb")); 
socket.connect(); 

Затем, как я получаю аудио? В чем заключается этот метод: startBuetoothSco? Чтобы включить звук в динамик, следует ли использовать Auditrack?

int buffersize = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_8BIT); 
soundData = new byte [buffersize*5];  
audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 
    8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_8BIT, 
    soundData.length,AudioTrack.MODE_STREAM); 

Но, тогда, Должен ли я заполнять буфер soundData? Как? Использование сокета (в потоке)?

mmInStream = socket.getInputStream(); 
    public void run() { 
    byte[] buffer = new byte[8000*2]; 
     while (true) { 
      bytes = mmInStream.read(buffer); 
      audioTrack.write(buffer, 0, bytes); //write directly? 
     }} 

И startBuetoothSco() для чего? Знать государства sco? SCO_AUDIO_STATE_CONNECTED ... Или отправлять/получать данные? Я не понимаю, как получить аудиоданные от гарнитуры, а затем как передавать потоки в динамик. Необходимо установить соединение SCO (с AudioManager), чтобы получить данные о Bluetooth-гарнитуре?

Очень сложно найти информацию об этой проблеме, и документация по android очень бедна (эта тема).

+0

Вы можете использовать мой ответ по адресу http://stackoverflow.com/questions/14991158/using-the-android-recognizerintent-with-a-bluetooth-headset/14993590#14993590 –

+0

Oks, я могу установить соединение SCO, но потом, как мне получить аудио? – jlmg5564

+0

Я не знаю, можно ли выпустить звук из гарнитуры Bluetooth в динамик. Почему бы вам не попробовать SoundAbout, чтобы убедиться, что он делает что-то подобное в первую очередь. Ссылка https://play.google.com/store/apps/details?id=com.woodslink.android.wiredheadphoneroutingfix –

ответ

0

для извлечения аудиоданных вы можете установить источник потока. Например, если вы хотите записывать звук через Bluetooth-гарнитуру, можно инициализировать AudioRecord и AudioManager следующим образом:

AudioRecord ar = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        RECORDER_SAMPLERATE, 
        RECORDER_OUT_CHANNELS, 
        RECORDER_AUDIO_ENCODING, 
        bufferSize); 
ar.startRecording(); 

и вызвать

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
am.startBluetoothSCO(); 

вы можете определить поток для чтения аудиоданных, в которых вы пишете следующий код:

private Runnable run_record = new Runnable(){ 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     short dataBuf[] = new short[bufferSize]; 
     FileOutputStream os = null; 
     try { 
      os = new FileOutputStream(file_path); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     while(isRecording){ 
      ar.read(dataBuf, 0, bufferSize); 
      Log.d(LOG_TAG, "writing "+bufferSize+" bytes of data to file "+file_path); 
      byte data[] = short2byte(dataBuf); 
      try { 
       os.write(data, 0, bufferSize); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     try { 
      os.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    }}; 

Мне жаль, что я не объяснил это четко.