2010-10-26 68 views
13

Tôi đang viết một ứng dụng Android để lưu trữ và quản lý bản ghi nhớ bằng giọng nói với một số siêu dữ liệu cơ bản và gắn thẻ. Khi ghi âm tôi sử dụng:Cách ghi âm bằng tai nghe bluetooth

recorder = new MediaRecorder();   
recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
recorder.setOutputFile(currentRecordingFileName); 
// and so on 

Điều này hoạt động tốt khi sử dụng điện thoại theo cách thông thường. Tuy nhiên, nó không phát hiện sự hiện diện của tai nghe bluetooth và vẫn sử dụng micrô của điện thoại ngay cả khi tai nghe được cắm vào.

Tôi cũng đã thử sử dụng MediaRecorder.AudioSource.DEFAULT, hy vọng nó sẽ tự động chọn nguồn chính xác, nhưng không có âm thanh nào được ghi lại.

Làm cách nào để phát hiện xem tai nghe bluetooth có được cắm vào và/hoặc b) sử dụng tai nghe bluetooth làm nguồn âm thanh cho đầu ghi phương tiện không?

Trả lời

0

Bạn có thể detect connected bluetooth devices như thế này:

Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); 
// If there are paired devices 
if (pairedDevices.size() > 0) { 
    // Loop through paired devices 
    for (BluetoothDevice device : pairedDevices) { 
     // Add the name and address to an array adapter to show in a ListView 
     mArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 
    } 
} 

Tuy nhiên, tôi không chắc chắn làm thế nào bạn làm cho nó ghi lại từ tai nghe và không phải là MIC thường xuyên

1

Theo tài liệu bạn cần để bắt đầu một Kết nối âm thanh SCO với AudioManager.startBluetoothSco() và sau đó có vẻ như bạn cần sử dụng MediaRecorder.AudioSource.VOICE_CALL.

Theo như tôi thấy, bạn không thể chọn một thiết bị cụ thể và như vậy. Điều này được thực hiện ở mức hệ thống, tức là sau khi người dùng ghép nối tai nghe với điện thoại.

EDIT:

Như đã đề cập bởi Stefan, các AudioSource cần phải được MIC.

VOICE_CALL dường như không hoạt động.

6

olivierg về cơ bản là đúng (AudioSource vẫn có thể được MIC), một số mã cơ bản sẽ trông như thế này:

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

này tôi stumbled khi này bản thân mình chỉ là một lần nữa, tôi muốn chỉ ra tầm quan trọng của bình luận slott của để bao gồm các quyền phù hợp, quan trọng nhất là đặt

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 

trong tệp kê khai của bạn. Nếu không có nó, bạn sẽ không nhận được bất kỳ thông báo lỗi nào nhưng trạng thái sẽ không thay đổi thành kết nối.

+1

Dont quên thiết lập cho phép: slott

+0

@Stephan, tôi đã thử phương pháp của bạn và nó hoạt động tốt với loa rảnh tay Bluetooth. Nhưng khi tôi thử cùng một mã trong một chiếc xe nó không hoạt động, bất kỳ ý tưởng nào nếu giao thức được sử dụng trong xe hơi khác với loa rảnh tay? – Harish

+0

@Stephan: Tôi đã thử mã của bạn bằng bluetooth thiết bị cầm tay nhưng nó chỉ ghi lại từ MIC của tôi trong điện thoại. Nó không hoạt động trong MIC của loa cầm tay. Tôi đang sử dụng loa HS3000 và thiên hà S2. Đây là mã của tôi. Vui lòng kiểm tra sự cố giúp tôi về vấn đề https://github.com/mjohn123/HeadsetRecorder – user8264

Các vấn đề liên quan