這個帖子代碼主要源於:
https://github.com/xiaofei-dev/Vibrator
再此基礎上進行稍微修改,代碼如下:
使用方式如下:
private VibratorUtil vibratorUtil;
/**
* 初始化震動
*/
private void initVibratorUtil(){
vibratorUtil = new VibratorUtil((Vibrator)getSystemService(Service.VIBRATOR_SERVICE));
}
private void startVibrator(){
vibratorUtil.setVibratePattern(1000);
vibratorUtil.vibrate(VibratorUtil.Companion.getINTERRUPT());
}
/** 停止震動 */
private void stop(){
vibratorUtil.stopVibrate();
}
源碼如下:
//此類用於描述振動屬性,即Vibrator類的方法參數值
class VibratorUtil(private val mVibrator: Vibrator) {
companion object {
private val TAG = "VibratorUtil"
//振動模式爲斷續
val INTERRUPT = 0
//振動模式爲持續
val KEEP = 1
var mPattern = longArrayOf(0, 0, 0)
}
//通過設置一個小時時長來模擬持續不停地震動
private var mDuration = (1000 * 60 * 60).toLong()
private val mPatternKeep = longArrayOf(1, (1000 * 10).toLong(), 1, (1000 * 10).toLong())
var isVibrate: Boolean = false
private set
private val mAudioAttributes = AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ALARM) //key
.build()
fun setDuration(duration: Long) {
mDuration = duration
}
//開始震動
fun vibrate(mode: Int) {
Log.d(TAG, "vibrate:0 ")
isVibrate = true
when (mode) {
INTERRUPT -> {
if (Build.VERSION.SDK_INT >= 21){
//適配在高版本系統上無法後臺震動的問題
mVibrator.vibrate(mPattern, -1, mAudioAttributes)
}else{
mVibrator.vibrate(mPattern, -1)
}
Log.d(TAG, "vibrate:0 ")
}
KEEP ->
if (Build.VERSION.SDK_INT >= 21){
//適配在高版本系統上無法後臺震動的問題
mVibrator.vibrate(mPatternKeep, -1, mAudioAttributes)
}else{
mVibrator.vibrate(mPatternKeep, -1)//-1是不循環,如果是0則從0開始
}
else -> {
}
}
}
fun stopVibrate() {
isVibrate = false
mVibrator.cancel()
}
public fun setVibratePattern(duration: Int) {
// long[] patter = {1000, 1000, 2000, 50};數組的a[0]表示靜止的時間,a[1]代表的是震動的時間,然後數組的a[2]表示靜止的時間,a[3]代表的是震動的時間
mPattern[1] = (duration * 16).toLong()
mPattern[2] = (duration * 4).toLong()
}
}