【Android】AudioManagerのgetRingerModeで取得できるRINGER_MODE_SILENTについて

仕事でマナーモードでも音をだしたいという案件があったわけで

Android7~10まで動作確認をしていて
気になった点をメモ

ややこしくなると思うけど自分用メモなのであしからず

たたみます

まずAudioManagerのgetRingerModeで取得できる値について

公式ドキュメントはこちらから

  • RINGER_MODE_NORMAL → 通常の状態
  • RINGER_MODE_VIBRATE → 着信音の音量を0にしてバイブレーションがONの状態
  • RINGER_MODE_SILENT → ????
はい、表題にもあります「RINGER_MODE_SILENT」
この値が返ってくる条件がちょっと不可解だったのですよ

Android7と8は本体のボリュームキー押下で着信音の音量を調整ができます(端末はXPERIA Z4とAQUOS sense2)

音量を0にするとバイブレーションマークもしくはマナーモードマークが点灯します
ここから更にマイナス操作をすると、
Android7:「通知の鳴動制限」がONになります
Android8:サイレント状態になります

このときgetRingerModeを実行するとRINGER_MODE_SILENTが取得できます

これは納得

一方Android9と10は本体のボリュームキー押下でメディアの音量を調整ができます(端末はとAQUOS sense2とPixel4)
なので着信音の音量は通常では操作できません(着信がなっているときにやれば可)

設定の音から「着信音の音量」を0にする、もしくはボリュームキーでメディアの音量調整中にベルのマークを押下すると
バイブレーションマークが点灯します

9以上はボリュームキーではサイレントにできなくて、ボリュームキーでメディアの音量調整中にバイブのマークを押下すると
「ミュート」と表示されベルマークに斜線がはいったアイコンが表示されます

このときgetRingerModeを実行するとRINGER_MODE_SILENTが取得できます

はい、ここからが本題

Android9には「高度なマナーモード」
Android10には「サイレントモード」という通常のマナーモードとは独立した機能が存在します

SHARPのQAに説明があります

コントロールパネルもしくは設定の音メニューから各々ON/OFFが可能です

これをONにしても着信音の音量を0にすることはありません
独立している機能だから

ということは

RINGER_MODE_NORMALの状態から設定をONにすることで高度なマナーモード・サイレントモード状態になるわけです

このときgetRingerModeを実行するとRINGER_MODE_SILENTが取得できます

わかりますか?
着信音の音量が0でないのにRINGER_MODE_SILENTとなるわけです

しかし、この状態でgetStreamVolume、isStreamMuteを実行すると
高度なマナーモード・サイレントモードをONにする前の音量値・ミュート状態が返ってきます

つまりRINGER_MODE_SILENTを解除し、音を鳴動した後、後片付けでもとの状態に復元しようとしたとき

ミュート状態だったのか、高度なマナーモード・サイレントモードがONだったのかの判定が必要になってしまったわけです

で、調べたわけです

判定の方法がありました
こちらのスレッドのところに

int prevZenMode = 0;
try {
 prevZenMode = Settings.Global.getInt(getContentResolver(), "zen_mode");
} catch (Settings.SettingNotFoundException e) {
 e.printStackTrace();
}

この設定値取得で高度なマナーモード・サイレントモードがOFFであれば0
ONになっていれば0以外が取得できました

Android8だけバイブレーション時に10が返ってきましたけど・・・これだけ謎

とりあえずこの処理が7~10すべてに使えました
が、今回の問題になったのは9と10なので9以上の後片付け時に参照するようにしました

以上です

この記事へのコメント