(注意)現在Android 6.0 Marshmallowでの動作は確認できていません。
手元のNexus 5(MRA58K)で確認したところSettingNotFoundException(API23より追加)が出るため、塞がれている可能性が高いです。
Lollipopで追加されたマナーモード設定を参照する
Lollipop以前ではマナーモードはVolumeオフでしかありませんでしたが、Lollipopになってマナーモードという、通知やAlarmをスリープさせるモードが追加されました。
そのモード中はアラームも鳴らないため(AlarmManagerがサスペンドされる?)、アラーム系のアプリや通知系のアプリでは設定を検知した時注意したいかもしれません。
そこで調べてみました。
取得方法
設定値は通常のSystem設定のProviderで公開されているため、特別な権限は必要ありません。
int mode = Settings.Global.getInt(getContext().getContentResolver(),
"zen_mode");
"zen_mode"というフィールド名はSettings.Globalの中に@hideで定義されています。
Android 5.1以降で追加されています。
/**
* Defines global zen mode. ZEN_MODE_OFF, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
* or ZEN_MODE_NO_INTERRUPTIONS.
*
* @hide
*/
public static final String ZEN_MODE = "zen_mode";
/** @hide */ public static final int ZEN_MODE_OFF = 0;
/** @hide */ public static final int ZEN_MODE_IMPORTANT_INTERRUPTIONS = 1;
/** @hide */ public static final int ZEN_MODE_NO_INTERRUPTIONS = 2;
それぞれなんとなくわかりますが、通知領域に表示されている、すべて・重要・マナーモードに当てはまります。
他にもzenmodeの維持する時間を設定するzen_mode_config_etagもあります。
/**
* Opaque value, changes when persisted zen mode configuration changes.
*
* @hide
*/
public static final String ZEN_MODE_CONFIG_ETAG = "zen_mode_config_etag";
変更方法
変更も同様の方法で可能ですが、実行には android.permission.WRITE_SECURE_SETTINGS
が要求されます。
そのため、自分でAndroidをBuildしたり、rootを取得して権限を適切に取得しない限りは使えません。
boolean result = Settings.Global.putInt(getContext().getContentResolver(),
"zen_mode", (Integer) value);