課題
Android でマイクを使用しようとした際、他のアプリが既に使用していると録音ができません。
録音できないだけならまだしも、気を付けないと録音しているつもりの音声が、マイクを握っているアプリに流れているということになってしまいます。
VoIP系のアプリが同時に動作すると、話しているつもりの相手ではなく、別の相手にのみ声が届いているという最悪の事態になりかねません。。。
やりたいこと
自分のアプリがマイクを使えてないことを検知して、録音を止める。
対応方法
録音時は以下の流れとなります。
AudioRecord
AudioRecord audioRecord = new AudioRecord(,,,,);
audioRecord.setRecordPositionupdateListener(new AudioRecord.OnRecordPositionupdateListener() {
// フレームごとの処理
@Override
public void onPeriodicNotification(AudioRecord recorder) {
audioRecord.read();
}
});
audioRecord.setPositionNotificationPeriod();
audioRecord.startRecording();
audioRecord.read();
・
・
・
audioRecord.stop();
ところが、他のアプリがマイクを使用していても、どの関数もエラーを返さないようなのです。。。
しかし、マイク利用の競合のあるなしの違いがありました。
マイクを取得できていない場合、フレームごとの処理を行うためのコールバックである onPeriodicNotification が呼ばれないようです。
したがって、一定時間経過後 onPeriodicNotification が呼ばれなければ、他のアプリにマイクが取得されていると判断できるようです。
確認した内容・環境
内容
Line, Facebook messenger で通話中に onPeriodicNotification が呼ばれないことの確認
環境
Nexus 6 (7.1.1) , Nexus 7 (6.0.1)
備考
- もっとよい方法があったら教えてください!
- この方法で検知できない場合があれば教えてください!