uniapp 安卓和ios震动方法,支持息屏和后台震动,ios和安卓均通过测试

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博客

相关拼贴

bet3365备用 刼的意思,刼的解释,刼的拼音,刼的部首
bet3365备用 中国女排3:0完胜韩国队 世联赛首战告捷
365bet软件 神秘海域4一共多少章

神秘海域4一共多少章

📅 08-21 👀 4090