uniapp 安卓和ios震动方法,支持息屏和后台震动,ios和安卓均通过测试
最近使用uniapp开发震动功能,发现uniapp提供的 uni.vibrateLong()的方法震动比较弱,而且不支持息屏和后台震动。plus.ios.importClass("UIImpactFeedbackGenerator")是在网上看到的,这个震动也比较弱,ios也不支持息屏和后台震动。
这种方式不支持后台/息屏震动,屏幕一关闭或者软件退到桌面就会停止震动,而且震动也比较弱:
// 震动
let vibrateTimer = null;
const palyVibration = (interval = 1000) => {
// 先停止可能存在的震动
stopVibration();
let platform = uni.getSystemInfoSync().platform;
if (platform === "ios") {
// iOS循环震动
const doVibrate = () => {
let UIImpactFeedbackGenerator = plus.ios.importClass("UIImpactFeedbackGenerator");
let impact = new UIImpactFeedbackGenerator();
impact.prepare();
impact.init(1);
impact.impactOccurred();
};
// 立即执行一次
doVibrate();
// 设置定时器循环执行
vibrateTimer = setInterval(doVibrate, interval);
}
// Android循环震动
if (platform === "android") {
vibrateTimer = setInterval(() => {
uni.vibrateLong();
}, interval);
}
}
上面的代码不支持后台/息屏震动(屏幕一但关闭或者软件退到桌面就会停止震动),而且震动也比较弱
最好的解决震动方法,代码如下:
uniapp 安卓和ios震动方法,支持息屏和后台震动,即使软件在退出桌面也能正常震动,安卓和ios均测试正常可用。
//震动
let platform = uni.getSystemInfoSync().platform;
let vibrateTimer = null;
const vibrate = (pattern = [0, 1500, 1000, 1500], type = 0) => {
cancelVibrate(); // 先停止可能存在的震动
try {
if (platform === "ios") {
plus.device.vibrate(pattern);
const doVibrate = () => plus.device.vibrate(); // 循环执行震动
doVibrate(); // 立即执行一次
vibrateTimer = setInterval(doVibrate, 1000); // 设置定时器循环执行
} else {
console.log('震动频率', pattern)
var Build = plus.android.importClass("android.os.Build");
if (Build.VERSION.SDK_INT >= 26) {
var Context = plus.android.importClass("android.content.Context");
var main = plus.android.runtimeMainActivity();
var vibrateService = main.getSystemService(Context.VIBRATOR_SERVICE);
var AudioAttributes = plus.android.importClass("android.media.AudioAttributes");
var audioAttributesBuilder = new AudioAttributes.Builder();
plus.android.invoke(audioAttributesBuilder, 'setContentType', AudioAttributes.CONTENT_TYPE_SONIFICATION);
plus.android.invoke(audioAttributesBuilder, 'setUsage', AudioAttributes.USAGE_ALARM);
var audioAttributes = plus.android.invoke(audioAttributesBuilder, 'build');
// plus.android.invoke(vibrateService, 'vibrate', [0,1000], 0, audioAttributes);
// plus.android.invoke(vibrateService, 'vibrate', [0,1500,1000,1500], 0, audioAttributes);
plus.android.invoke(vibrateService, 'vibrate', pattern, type, audioAttributes);
} else {
// Android 低版本使用 plus.device.vibrate,无法实现自定义模式
vibrateTimer = setInterval(() => plus.device.vibrate(), 1000);
}
}
} catch (e) {
console.log(JOSN.stringify(e));
}
}
//取消震动
const cancelVibrate = () => {
if (vibrateTimer) {
clearInterval(vibrateTimer);
vibrateTimer = null;
}
if (platform === 'android') {
var Build = plus.android.importClass("android.os.Build");
if (Build.VERSION.SDK_INT >= 26) {
var vib = plus.android.runtimeMainActivity().getSystemService("vibrator");
plus.android.invoke(vib, "cancel");
}
}
}
如果感兴趣,可以到我个人博客网站,查看更多教程:Yun博客