少しハマったので書いておきます。
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 |