1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Android でマイクの競合を検知する方法

Posted at

課題

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)

備考

  • もっとよい方法があったら教えてください!
  • この方法で検知できない場合があれば教えてください!
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?