如何获取Android系统默认通知振动模式的long[]数组?
获取系统默认通知振动模式的解决方案
问题背景
我开发的应用会拦截通知并立即移除,避免系统自动播放振动,但之后需要手动触发对应渠道的默认振动模式。目前的困境是:
- 当通知渠道的
mVibrationEnabled为true但mVibration为null时,系统会播放默认振动模式 - 对于带自定义振动模式的渠道,我能获取到对应的
long[]数组,但找不到获取系统默认振动模式数组的方法(已能正常获取默认通知音效)
对应的NotificationChannel数据如下:
[NotificationChannel{mId='your_channel_id', mName=Your Channel Name, mDescription=hasDescription , mImportance=4, mBypassDnd=false, mLockscreenVisibility=-1000, mSound=content://settings/system/notification_sound, mLights=false, mLightColor=0, mVibration=null, mUserLockedFields=0, mUserVisibleTaskShown=false, mVibrationEnabled=true, mShowBadge=true, mDeleted=false, mDeletedTimeMs=-1, mGroup='null', mAudioAttributes=AudioAttributes: usage=USAGE_NOTIFICATION content=CONTENT_TYPE_SONIFICATION flags=0x800 tags= bundle=null, mBlockableSystem=false, mAllowBubbles=-1, mImportanceLockedByOEM=false, mImportanceLockedDefaultApp=false, mOriginalImp=4, mParent=null, mConversationId=null, mDemoted=false, mImportantConvo=false, mSoundMissingReason=0}]
可行解决方案
方案1:读取系统设置中的默认振动模式
系统默认振动模式存储在Settings.System.VIBRATE_PATTERN中,可通过ContentResolver读取并转换为long[]数组:
ContentResolver contentResolver = getContentResolver(); String patternStr = Settings.System.getString(contentResolver, Settings.System.VIBRATE_PATTERN); long[] defaultPattern = null; if (patternStr != null) { String[] strParts = patternStr.split(","); defaultPattern = new long[strParts.length]; for (int i = 0; i < strParts.length; i++) { defaultPattern[i] = Long.parseLong(strParts[i].trim()); } }
如果读取失败(部分定制ROM可能未定义该设置),可以使用通用的 fallback 模式,比如new long[]{0, 250, 250, 250}。
方案2:直接调用系统预定义的默认振动效果(推荐)
不需要手动获取数组,直接通过Vibrator服务触发系统默认的通知振动,兼容性更好:
Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); if (vibrator != null && vibrator.hasVibrator()) { // Android O及以上支持预定义振动效果 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { vibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_NOTIFICATION_DEFAULT)); } else { // 低版本直接使用通用默认模式 vibrator.vibrate(new long[]{0, 500}, -1); } }
注意事项
- 需在
AndroidManifest.xml中添加振动权限:<uses-permission android:name="android.permission.VIBRATE" /> - Android 13+ 若涉及通知相关操作,需额外申请
POST_NOTIFICATIONS权限,但振动核心依赖VIBRATE权限
内容的提问来源于stack exchange,提问作者Cymro
相关产品推荐
相关产品推荐

