当前位置: 首页 > article >正文

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


http://www.kler.cn/a/414308.html

相关文章:

  • 数据结构与算法(排序算法)
  • STM32-C语言基础知识
  • TheadLocal出现的内存泄漏具体泄漏的是什么?弱引用在里面有什么作用?什么情景什么问题?
  • 水母形状电池:助力机器人性能提升
  • 【西瓜书】决策树
  • 网络空间安全之一个WH的超前沿全栈技术深入学习之路(13-2)白帽必经之路——如何用Metasploit 渗透到她的心才不会让我释怀
  • 力扣刷题--42.接雨水【图文详解|超级详细】
  • JAVA项目-------医院挂号系统
  • 鸿蒙征文|鸿蒙技术分享:使用到的开发框架和技术概览
  • 一些k8s和docker的命令
  • javaweb-day03-前端零碎
  • golang 实现比特币内核:如何接入 RPC 后端获得特定交易的二进制数据
  • wxFormBuilder:可视化设计、学习wxWidgets自带UI控件的好工具
  • ML 系列:第 32节 — 机器学习中的统计简介
  • 33 基于单片机的智能窗帘控制系统
  • 分布式链路追踪系统
  • elasticsearch单节点模式部署
  • SAP开发语言ABAP开发入门
  • 试用 Llama-3.1-8B-Instruct AI 模型
  • 如何使用 Codegen 加速 React Native 开发?