android microphone simultaneous

Usa el micrófono en múltiples aplicaciones simultáneamente en Android



microphone simultaneous (1)

Este escenario pasa

por ejemplo

Cuando quieras grabar una llamada telefónica. Puede utilizar la grabadora de llamadas de código abierto. mira this y this

Aquí hay un ejemplo de código.

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; }

Tenemos un dispositivo Android en el que nos gustaría usar el microphone en 2 aplicaciones simultáneamente.

De hecho, tenemos un servicio de comando vocal que se ejecuta en segundo plano (estamos utilizando la biblioteca CMU Sphinx ). El problema es que cuando iniciamos una grabadora de video (aplicación de cámara), no podemos iniciar la grabación ya que 2 aplicaciones no pueden acceder al micrófono al mismo tiempo.

Error

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)

Tenga en cuenta que la cámara funciona bien cuando el servicio vocal está desactivado.

Además, señalo que ya he leído este hilo:

Android: acceso simultáneo al micrófono (RecognizerIntent + propia aplicación)

pero la diferencia aquí es que tenemos una mano en O / S y en el núcleo. Así que podemos aplicar el parche si es necesario.

¿Es una limitación SDK/OS/Kernel ? Hay algún trabajo alrededor ?