简体   繁体   English

在Android中同时在多个应用中使用麦克风

[英]Use microphone in multiple app simultaneously in Android

We have an Android device on which we would like to use the microphone in 2 app simultaneously. 我们有一个Android设备,我们希望同时在2个应用程序中使用microphone

In fact, we have a vocal command service that is running in the background (we are using the CMU Sphinx library). 实际上,我们有一个在后台运行的声音命令服务(我们使用的是CMU Sphinx库)。 The problem is when we start a video recorder (camera application), we can't start the recording as 2 applications can't access to the microphone at the same time. 问题是当我们启动录像机(相机应用程序)时,我们无法启动录制,因为2个应用程序无法同时访问麦克风。

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)

Note that the camera works well when the vocal service is off. 请注意,当人声服务关闭时,相机可以正常工作。

Moreover, I precise that I've already read this thread : 而且,我确切地说我已经读过这个帖子了:

Android: Accessing the microphone simultaniously (RecognizerIntent + own app) Android:同时访问麦克风(RecognizerIntent +自己的应用)

but the difference here is that we have a hand on the O/S and the kernel. 但这里的不同之处在于我们可以在O / S和内核上进行操作。 So we can apply patch if needed. 所以我们可以根据需要应用补丁。

Is it an SDK/OS/Kernel limitation? 它是SDK/OS/Kernel限制吗? Is there any workaround ? 有没有解决方法?

This scenario happens 这种情况发生了

for instance 例如

when you want to record phone call. 当你想录制电话时。 you can use the open source call recorder. 你可以使用开源调用记录器。 see this and this 看到这个这个

Here is a code sample 这是一个代码示例

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM