仕事でマナーモードでも音をだしたいという案件があったわけで
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以上の後片付け時に参照するようにしました
以上です
この記事へのコメント