2つのアプリで同時にmicrophone
を使用したいAndroidデバイスがあります。
実際、バックグラウンドで実行されている音声コマンドサービスがあります(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
の制限ですか?回避策はありますか?
このシナリオが発生します
例えば
通話を録音したいとき。オープンソースのコールレコーダーを使用できます。 this および this を参照してください
これがコードサンプルです
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;
}