更新记录

0.0.1(2026-03-06)

  • 初始版本发布
  • 支持监听设备握持手势状态
  • 支持检测左手、右手、双手握持等状态
  • 提供 onoffonceisListening API

平台兼容性

uni-app(4.87)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - - - - - - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - - -

uni-app x(4.87)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - - - -

lime-holding-hand

一个用于监听设备握持手势状态的UTS插件,支持检测设备的握持方式(左手、右手、双手等)。

安装方法

  1. 在uni-app插件市场中搜索并导入lime-holding-hand
  2. 仅支持鸿蒙
  3. uniappx支持试用,uniapp只能源码

快速开始

import { holdingStatusMonitor } from '@/uni_modules/lime-holding-hand';

// 定义状态映射
const map = new Map([
  [0, '未握持'],
  [1, '左手握持'],
  [2, '右手握持'],
  [3, '双手握持'],
  [16, '未识别'],
  [-1, '监听出错']
]);

// 监听握持状态
const onHoldingChange = (data) => {
  if (data.holdingHandStatus == -1) {
    console.error('监听失败:', data.errMsg);
    console.error('错误码:', data.statusCode);
    return;
  }

  const statusText = map.get(data.holdingHandStatus) ?? '未知状态';
  console.log('当前握持状态:', statusText);
};

// 开始监听
holdingStatusMonitor.on(onHoldingChange);

// 检查监听状态
console.log('是否正在监听:', holdingStatusMonitor.isListening());

// 页面卸载时取消监听
onUnmounted(() => {
  holdingStatusMonitor.off(onHoldingChange);
});

示例:根据握持状态调整悬浮按钮位置

<l-fab :offset="offset">
  <l-icon size="24px" color="white" name="menu"></l-icon>
</l-fab>
import { holdingStatusMonitor, type HoldingHandResult } from '@/uni_modules/lime-holding-hand';

const offset = ref([-1, 350])

const onHoldingChange = (data: HoldingHandResult) => {
  if (data.holdingHandStatus == -1) {
    console.error('监听失败:', data.errMsg);
    console.error('错误码:', data.statusCode);
    return;
  }

  // 左手握持时,悬浮按钮靠左
  if (data.holdingHandStatus == 1) {
    offset.value[0] = 0
  } 
  // 右手握持时,悬浮按钮靠右
  else if (data.holdingHandStatus == 2) {
    offset.value[0] = -1
  }
  // 触发响应式更新
  offset.value = [...offset.value]
};

holdingStatusMonitor.on(onHoldingChange);

onUnmounted(() => {
  holdingStatusMonitor.off(onHoldingChange);
});

API

holdingStatusMonitor

握持手势状态监听器,提供静态方法用于监听设备握持状态变化。

方法

on(callback)

开始监听握持手势变化。

参数

参数名 类型 必填 说明
callback HandStatusCallback 握持状态变化时的回调函数

回调参数

回调函数接收 HoldingHandResult 对象:

属性名 类型 说明
holdingHandStatus number 握持状态值,详见握持状态说明
statusCode number 状态码,成功时为 0,失败时为错误码
errMsg string 状态信息,成功时为 'ok',失败时为错误信息

示例

import { holdingStatusMonitor } from '@/uni_modules/lime-holding-hand';

const callback = (data) => {
  console.log('握持状态:', data.holdingHandStatus);
  console.log('状态码:', data.statusCode);
  console.log('信息:', data.errMsg);
};

holdingStatusMonitor.on(callback);
off(callback?)

取消监听握持手势变化。

参数

参数名 类型 必填 说明
callback HandStatusCallback 要取消的回调函数,不传则清除所有回调

示例

// 取消指定回调
holdingStatusMonitor.off(callback);

// 取消所有回调
holdingStatusMonitor.off();
once(callback)

一次性监听,触发一次后自动取消。

参数

参数名 类型 必填 说明
callback HandStatusCallback 握持状态变化时的回调函数

示例

holdingStatusMonitor.once((data) => {
  console.log('仅触发一次:', data.holdingHandStatus);
});
isListening()

获取当前监听状态。

返回值

类型 说明
boolean 是否正在监听

示例

const isListening = holdingStatusMonitor.isListening();
console.log('是否正在监听:', isListening);

握持状态说明

holdingHandStatus 可能的值:

名称 说明
NOT_HELD 0 表示未握持
LEFT_HAND_HELD 1 表示左手握持
RIGHT_HAND_HELD 2 表示右手握持
BOTH_HANDS_HELD 3 表示双手握持
UNKNOWN_STATUS 16 表示未识别
- -1 表示监听出错(非原生状态)

错误码说明

statusCode 可能的错误码:

错误码ID 错误信息
201 权限被拒绝。尝试订阅 holdingHandChanged 事件被权限 ohos.permission.DETECT_GESTURE 禁止。
801 能力不支持。由于设备能力有限,功能无法正常工作。
31500001 服务异常。可能原因:1. 系统错误,如空指针、容器相关异常;2. N-API 调用异常,无效的 N-API 状态。
31500002 订阅失败。可能原因:1. 回调注册失败;2. 绑定原生对象到 JS 包装器失败;3. N-API 调用异常,无效的 N-API 状态;4. IPC 请求异常。

支持与赞赏

如果你觉得本插件解决了你的问题,可以考虑支持作者:

支付宝赞助 微信赞助
支付宝赞赏码 微信赞赏码

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。