LoginSignup
1
2

More than 5 years have passed since last update.

Androidでマナーモード(バイブモード)にならないときにチェックすること

Posted at

少しハマったので書いておきます。

x.まず結論

バイブレーターが搭載されてるかチェックしろ!!

$ adb shell dumpsys audio | grep mHasVibrator
  mHasVibrator=true

このmHasVibratorがtrue/falseでわかります。

1.なぜバイブモードにならないか

OpenGrokで公開しているAndroidのソースコードサービスから参照。
おもっきしバイブレーター搭載されてなかったら
RING_MODE_VIBRATE を RING_MODE_SILENT にしとる

   2069     private void setRingerMode(int ringerMode, String caller, boolean external) {
   2070         if (mUseFixedVolume || isPlatformTelevision()) {
   2071             return;
   2072         }
   2073         if (caller == null || caller.length() == 0) {
   2074             throw new IllegalArgumentException("Bad caller: " + caller);
   2075         }
   2076         ensureValidRingerMode(ringerMode);
   2077         if ((ringerMode == AudioManager.RINGER_MODE_VIBRATE) && !mHasVibrator) {
   2078             ringerMode = AudioManager.RINGER_MODE_SILENT;
   2079         }
   2080         final long identity = Binder.clearCallingIdentity();
   2081         try {
   2082             synchronized (mSettingsLock) {
   2083                 final int ringerModeInternal = getRingerModeInternal();
   2084                 final int ringerModeExternal = getRingerModeExternal();
   2085                 if (external) {
   2086                     setRingerModeExt(ringerMode);
   2087                     if (mRingerModeDelegate != null) {
   2088                         ringerMode = mRingerModeDelegate.onSetRingerModeExternal(ringerModeExternal,
   2089                                 ringerMode, caller, ringerModeInternal, mVolumePolicy);
   2090                     }
   2091                     if (ringerMode != ringerModeInternal) {
   2092                         setRingerModeInt(ringerMode, true /*persist*/);
   2093                     }
   2094                 } else /*internal*/ {
   2095                     if (ringerMode != ringerModeInternal) {
   2096                         setRingerModeInt(ringerMode, true /*persist*/);
   2097                     }
   2098                     if (mRingerModeDelegate != null) {
   2099                         ringerMode = mRingerModeDelegate.onSetRingerModeInternal(ringerModeInternal,
   2100                                 ringerMode, caller, ringerModeExternal, mVolumePolicy);
   2101                     }
   2102                     setRingerModeExt(ringerMode);
   2103                 }
   2104             }
   2105         } finally {
   2106             Binder.restoreCallingIdentity(identity);
   2107         }
   2108     }

2.なぜ引っかかったのか

エミュレータで確認していたのですが、Android6.x台ではこれtrueなんです。
ところがAndroid7.0のエミュレータだとfalseになっているのです。

これを知らず「え!なんで!!」ってなりAndriodのソースコードを解析しておりました…

3.おまけ(SILENT指定時の挙動)

AudioManager#setRingMode()でMODE_SILENTを指定した時の挙動は以下のとおり

AndroidVersion Act
〜4.4 Silent Mode
5.x Important Notification only Mode
6.0〜 Alarm only Mode
1
2
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
2