Использовать микрофон в нескольких приложениях одновременно на Android

У нас есть устройство Android, на котором мы хотели бы использовать microphone в двух приложениях одновременно.

Фактически, у нас есть служба вокальных команд, которая работает в фоновом режиме (мы используем библиотеку CMU Sphinx ). Проблема в том, что когда мы запускаем видеомагнитофон (приложение камеры), мы не можем начать запись, так как 2 приложения не могут одновременно получить доступ к микрофону.

ошибка

 08-20 12:20:14.601: I/MediaRecorderJNI(7261): prepare: surface=0x59590668 08-20 12:20:15.916: E/MediaRecorder(7261): start failed: -38 08-20 12:20:15.916: E/com.example.CamcorderView(7261): Failed to start recorder. 08-20 12:20:15.916: E/com.example.CamcorderView(7261): java.lang.IllegalStateException 08-20 12:20:15.916: E/com.example.CamcorderView(7261): at android.media.MediaRecorder.start(Native Method) 

Обратите внимание, что камера работает хорошо, когда вокальная служба выключена.

Более того, я точно знаю, что я уже прочитал эту тему:

Android: одновременный доступ к микрофону (RecognizerIntent + собственное приложение)

Но разница здесь в том, что мы имеем руку на O / S и ядро. Поэтому мы можем применить исправление, если это необходимо.

Это ограничение SDK/OS/Kernel ? Есть ли обходной путь?

Solutions Collecting From Web of "Использовать микрофон в нескольких приложениях одновременно на Android"

Этот сценарий

например

Когда вы хотите записать телефонный звонок. Вы можете использовать записывающее устройство с открытым исходным кодом. См. Это и это

Вот пример кода

 private MediaRecorder recorder = null; public void onCreate() { super.onCreate(); recorder = new MediaRecorder(); Log.i("CallRecorder", "onCreate created MediaRecorder object"); } public void onStart(Intent intent, int startId) { if (isRecording) return; Context c = getApplicationContext(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c); Boolean shouldRecord = prefs.getBoolean(Preferences.PREF_RECORD_CALLS, false); if (!shouldRecord) { Log.i("CallRecord", "RecordService::onStartCommand with PREF_RECORD_CALLS false, not recording"); return; } int audiosource = Integer.parseInt(prefs.getString(Preferences.PREF_AUDIO_SOURCE, "1")); int audioformat = Integer.parseInt(prefs.getString(Preferences.PREF_AUDIO_FORMAT, "1")); recording = makeOutputFile(prefs); if (recording == null) { recorder = null; return; //return 0; } Log.i("CallRecorder", "RecordService will config MediaRecorder with audiosource: " + audiosource + " audioformat: " + audioformat); try { // These calls will throw exceptions unless you set the // android.permission.RECORD_AUDIO permission for your app recorder.reset(); recorder.setAudioSource(audiosource); recorder.setOutputFormat(audioformat); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); recorder.setOutputFile(recording.getAbsolutePath()); //recorder.setMaxDuration(msDuration); //1000); // 1 seconds //recorder.setMaxFileSize(bytesMax); //1024*1024); // 1KB recorder.setOnInfoListener(this); recorder.setOnErrorListener(this); try { recorder.prepare(); } catch (java.io.IOException e) { Log.e("CallRecorder", "RecordService::onStart() IOException attempting recorder.prepare()\n"); t.show(); recorder = null; return; } Log.d("CallRecorder", "recorder.prepare() returned"); recorder.start(); isRecording = true; Log.i("CallRecorder", "recorder.start() returned"); updateNotification(true); } catch (java.lang.Exception e) { Log.e("CallRecorder", "RecordService::onStart caught unexpected exception", e); recorder = null; } return; }