Skills DirectorySkills Directory
SkillsLearnSecurityCategoriesDocsCommunityBlog
Sign InSubmit Skill
Skills Directory

Security-tested agent skills for Claude, coding agents, and AI workflows.

Directory

  • Browse Skills
  • All Skills A–Z
  • Claude Skills
  • Claude Code Skills
  • Agent Skills
  • Categories
  • Submit a Skill

Learn

  • Learn Hub
  • Install Claude Skills
  • Write SKILL.md
  • Skills vs MCP
  • Directories Compared

Security

  • Security
  • Methodology
  • Secure Claude Skills
  • Security Badges

Company

  • About
  • Community
  • Blog
  • API Docs
  • Advertise

2026 Skills Directory. All rights reserved.

Back to skills

Hmos Wear Engine Kit Request Authorization

ASecurity

请求Wear Engine服务用户授权,支持申请和查询权限,需华为账号登录且已申请接入Wear Engine服务,适用于手机侧应用首次使用穿戴设备能力前的权限申请场景

2 stars
0 votes
0 copies
0 views
Added 9/22/2026
developmenttypescriptapi

Works with

cliapi

Security Analysis

A100/100

Scanned 9/22/2026

Install to Claude Code

$npx -y skills add IsKenKenYa/skills --skill hmos-wear-engine-kit-request-authorization --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Hmos Wear Engine Kit Request Authorization?

Add the live security badge to your README — it updates automatically with every re-scan.

Security grade badge for Hmos Wear Engine Kit Request Authorization
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/iskenkenya-hmos-wear-engine-kit-request-authorization/badge)](https://www.skillsdirectory.com/skills/iskenkenya-hmos-wear-engine-kit-request-authorization)

More formats (shields.io, HTML) on the badges page.

Download Zip
Files
SUB_SKILL.md
---
name: hmos-wear-engine-kit-request-authorization
description: 请求Wear Engine服务用户授权,支持申请和查询权限,需华为账号登录且已申请接入Wear Engine服务,适用于手机侧应用首次使用穿戴设备能力前的权限申请场景
---

# 请求用户授权技能

## 功能描述

本技能用于实现Wear Engine服务的用户授权功能,包括申请穿戴设备权限和查询已授权权限。Wear Engine的API需要用户授权才能正常访问,建议开发者在用户首次调用Wear Engine开放能力时执行权限申请操作。

**核心能力**:
- 申请用户穿戴设备权限:拉起华为账号登录和授权界面,由用户授权相应的数据访问权限
- 查询用户授权结果:查询已被用户授予的应用权限

**适用场景**:
- 手机侧应用首次使用Wear Engine能力前
- 需要访问穿戴设备用户状态、传感器数据等隐私数据
- 检查应用是否已获得必要权限

**权限类型**:
- USER_STATUS: 获取用户状态权限(如穿戴设备佩戴状态)
- MOTION_SENSOR: 获取运动传感器数据权限(如加速度传感器数据)
- HEALTH_SENSOR: 获取人体传感器数据权限(如心率传感器数据)
- DEVICE_IDENTIFIER: 获取已连接穿戴设备的序列号

## 使用场景

### 触发词
- "请求用户授权"
- "申请穿戴设备权限"
- "查询用户权限"
- "Wear Engine授权"
- "申请USER_STATUS权限"
- "检查授权状态"

### 能做
- 拉起华为账号登录和授权界面,申请穿戴设备权限
- 查询应用已获得的用户授权权限
- 处理用户授权/拒绝授权的结果
- 在首次使用Wear Engine能力前主动申请权限
- 判断是否需要重新申请权限

### 绝不做
- 未申请接入Wear Engine服务时申请权限(会返回错误码1008500004)
- 未登录华为账号时强制申请权限(会返回错误码1008500008)
- 申请未在接入服务中审批通过的权限
- 在不支持Wear Engine的设备上调用(非Phone/Tablet设备会返回错误码801)
- 在非Stage模型环境中使用

### 补充
- 用户可以自主选择授权的数据类型,可以只授权部分权限
- 如果申请的权限之前已经授予,不会再弹出授权页面,接口会返回已授权的权限
- 建议在请求用户授权前,先使用查询接口判断应用是否已有相关权限
- 申请权限前必须先完成接入Wear Engine服务的申请流程

## 调用规范和规则

### 输入约束
- **Context要求**: 必须提供包含connectServiceExtensionAbility方法的Context(如UIAbilityContext)
- **权限类型**: 只能申请已在Wear Engine服务接入申请中审批通过的权限类型
- **设备类型**: 仅支持Phone和Tablet设备,其他设备会返回错误码801
- **运行模型**: 仅支持Stage模型

### 执行约束
- **前置条件**: 
  - 必须已申请接入Wear Engine服务
  - 用户需登录华为账号(未登录会弹出登录界面)
- **调用时机**: 建议在首次使用Wear Engine能力前调用
- **用户交互**: 申请权限时会拉起授权界面,需要用户手动授权
- **网络要求**: 需要网络连接,网络不可用会返回错误码1008500001

### 内容约束
- **禁止操作**: 
  - 不能绕过用户授权流程直接访问数据
  - 不能申请未审批通过的权限
  - 不能在用户拒绝后频繁重复申请
- **权限范围**: 只能申请USER_STATUS、MOTION_SENSOR、HEALTH_SENSOR、DEVICE_IDENTIFIER四种权限
- **隐私保护**: 必须明确告知用户申请权限的用途

### 降级约束
- **用户拒绝授权**: 返回已授权的权限列表(可能为空),应用应提示用户必要权限未授予
- **网络失败**: 提示用户检查网络连接,建议提供离线提示或稍后重试选项
- **未登录账号**: 自动拉起登录界面,用户取消登录则返回错误码1008500008
- **未申请服务**: 提示开发者先申请接入Wear Engine服务(错误码1008500004)
- **设备不支持**: 在非Phone/Tablet设备上返回错误码801,应用应做兼容处理

## 调用流程和步骤

### 步骤1: 准备阶段 - 导入模块和获取客户端

**前置校验**:
1. 确认应用已申请接入Wear Engine服务
2. 确认当前设备类型为Phone或Tablet
3. 确认运行环境为Stage模型
4. 准备UIAbilityContext上下文对象

**参数准备**:
```typescript
import { wearEngine } from '@kit.WearEngine';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';

// 获取AuthClient对象
let authClient: wearEngine.AuthClient = wearEngine.getAuthClient(this.getUIContext().getHostContext());
```

### 步骤2: 申请用户授权

**示例代码**:
```typescript
import { wearEngine } from '@kit.WearEngine';
import { BusinessError } from '@kit.BasicServicesKit';

async function requestUserAuthorization(context: common.UIAbilityContext): Promise<void> {
  try {
    // 步骤1: 获取AuthClient对象
    let authClient: wearEngine.AuthClient = wearEngine.getAuthClient(context);
    
    // 步骤2: 定义需要申请的权限
    let request: wearEngine.AuthorizationRequest = {
      permissions: [
        wearEngine.Permission.USER_STATUS,      // 用户状态权限
        wearEngine.Permission.HEALTH_SENSOR     // 健康传感器权限
      ]
    };
    
    // 步骤3: 请求用户授权
    const result = await authClient.requestAuthorization(request);
    
    console.info(`Succeeded in requesting authorization, authorized permissions: ${JSON.stringify(result.permissions)}`);
    
    // 步骤4: 检查授权结果
    if (result.permissions.length === 0) {
      console.warn('User denied all permissions');
      // 降级处理: 提示用户需要权限才能使用功能
    } else if (result.permissions.length < request.permissions.length) {
      console.warn('User only authorized partial permissions');
      // 降级处理: 提示用户部分权限未授予,部分功能可能受限
    } else {
      console.info('All permissions authorized');
      // 正常流程: 继续使用Wear Engine功能
    }
  } catch (error) {
    const err = error as BusinessError;
    console.error(`Failed to request authorization. Code: ${err.code}, Message: ${err.message}`);
    
    // 错误处理
    switch (err.code) {
      case 1008500001:
        console.error('Network error. Please check network connection.');
        break;
      case 1008500004:
        console.error('App has not applied for the Wear Engine service.');
        break;
      case 1008500006:
        console.error('User privacy is not agreed.');
        break;
      case 1008500008:
        console.error('User has not logged in with HUAWEI ID.');
        break;
      default:
        console.error('Unknown error occurred.');
    }
  }
}
```

### 步骤3: 查询已授权权限

**示例代码**:
```typescript
import { wearEngine } from '@kit.WearEngine';
import { BusinessError } from '@kit.BasicServicesKit';

async function queryUserAuthorization(context: common.UIAbilityContext): Promise<void> {
  try {
    // 步骤1: 获取AuthClient对象
    let authClient: wearEngine.AuthClient = wearEngine.getAuthClient(context);
    
    // 步骤2: 查询已授权的权限
    const result = await authClient.getAuthorization();
    
    console.info(`Succeeded in getting authorized permissions: ${JSON.stringify(result.permissions)}`);
    
    // 步骤3: 判断是否包含所需权限
    const requiredPermissions = [wearEngine.Permission.USER_STATUS];
    const hasAllPermissions = requiredPermissions.every(perm => 
      result.permissions.includes(perm)
    );
    
    if (hasAllPermissions) {
      console.info('All required permissions are authorized');
      // 正常流程: 可以直接使用Wear Engine功能
    } else {
      console.warn('Missing some required permissions');
      // 需要申请权限: 调用requestAuthorization
      await requestUserAuthorization(context);
    }
  } catch (error) {
    const err = error as BusinessError;
    console.error(`Failed to get authorization. Code: ${err.code}, Message: ${err.message}`);
  }
}
```

### 步骤4: 完整示例 - 权限检查和申请流程

**示例代码**:
```typescript
import { wearEngine } from '@kit.WearEngine';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';

export class WearEngineAuthHelper {
  private authClient: wearEngine.AuthClient | null = null;
  
  constructor(private context: common.UIAbilityContext) {}
  
  // 初始化AuthClient
  private initAuthClient(): void {
    if (!this.authClient) {
      this.authClient = wearEngine.getAuthClient(this.context);
    }
  }
  
  // 检查并申请权限
  async ensurePermissions(permissions: wearEngine.Permission[]): Promise<boolean> {
    this.initAuthClient();
    
    try {
      // 先查询已授权权限
      const authResult = await this.authClient!.getAuthorization();
      console.info(`Current authorized permissions: ${JSON.stringify(authResult.permissions)}`);
      
      // 检查是否已包含所需权限
      const missingPermissions = permissions.filter(perm => 
        !authResult.permissions.includes(perm)
      );
      
      if (missingPermissions.length === 0) {
        console.info('All permissions are already authorized');
        return true;
      }
      
      // 申请缺失的权限
      console.info(`Requesting missing permissions: ${JSON.stringify(missingPermissions)}`);
      const requestResult = await this.authClient!.requestAuthorization({
        permissions: missingPermissions
      });
      
      // 再次检查是否所有权限都已授予
      const allGranted = permissions.every(perm => 
        requestResult.permissions.includes(perm)
      );
      
      if (allGranted) {
        console.info('All permissions granted');
        return true;
      } else {
        console.warn('Some permissions were not granted');
        return false;
      }
    } catch (error) {
      const err = error as BusinessError;
      console.error(`Failed to ensure permissions. Code: ${err.code}, Message: ${err.message}`);
      return false;
    }
  }
  
  // 获取当前已授权权限
  async getCurrentPermissions(): Promise<wearEngine.Permission[]> {
    this.initAuthClient();
    
    try {
      const result = await this.authClient!.getAuthorization();
      return result.permissions;
    } catch (error) {
      const err = error as BusinessError;
      console.error(`Failed to get current permissions. Code: ${err.code}, Message: ${err.message}`);
      return [];
    }
  }
}

// 使用示例
async function exampleUsage() {
  const helper = new WearEngineAuthHelper(this.getUIContext().getHostContext());
  
  // 确保拥有用户状态和健康传感器权限
  const success = await helper.ensurePermissions([
    wearEngine.Permission.USER_STATUS,
    wearEngine.Permission.HEALTH_SENSOR
  ]);
  
  if (success) {
    console.log('Permissions ready, can use Wear Engine features');
    // 继续使用其他Wear Engine API
  } else {
    console.log('Permissions not ready, please grant permissions');
    // 提示用户授权
  }
}
```

## 错误码说明

| 错误码 | 说明 | 可能原因 | 解决方法 |
|-------|------|---------|---------|
| 401 | 参数错误 | 必填参数未指定、参数类型错误、参数验证失败 | 检查参数类型和必填项,确保AuthorizationRequest.permissions数组不为空 |
| 801 | 能力不支持 | 当前设备不支持此系统能力 | 在非Phone/Tablet设备上调用会返回此错误,需做设备兼容处理 |
| 1008500001 | 网络错误 | 网络不可用 | 提示用户检查网络连接,稍后重试 |
| 1008500004 | 未申请服务 | 应用未申请接入Wear Engine服务 | 先在华为开发者平台申请接入Wear Engine服务 |
| 1008500006 | 用户隐私未同意 | 用户未同意隐私协议 | 拉起授权界面时需用户同意隐私协议 |
| 1008500007 | 设备能力不支持 | 设备不支持该能力 | 检查设备是否支持所需能力 |
| 1008500008 | 账号未登录 | 用户未登录华为账号 | 会自动拉起登录界面,用户取消登录则返回此错误 |
| 1008500009 | 获取账号信息失败 | 无法获取华为账号信息 | 提示用户重新登录华为账号 |
| 1008509999 | 内部错误 | 系统内部错误 | 记录日志并上报问题,建议用户稍后重试 |

## 编译和修复问题

### 依赖声明
```json
{
  "name": "wear-engine-example",
  "version": "1.0.0",
  "dependencies": {
    "@kit.WearEngine": "^5.0.0",
    "@kit.BasicServicesKit": "^5.0.0",
    "@kit.AbilityKit": "^5.0.0"
  }
}
```

### 环境要求
- **HarmonyOS SDK**: 最低版本 5.0.0(12)
- **设备类型**: Phone、Tablet(其他设备返回错误码801)
- **运行模型**: Stage模型
- **系统能力**: SystemCapability.Health.WearEngine

### 常见编译问题

**问题1: 导入模块失败**
```
Error: Cannot find module '@kit.WearEngine'
```
**解决方法**: 
- 确保HarmonyOS SDK版本 >= 5.0.0(12)
- 检查module.json5中是否添加了依赖
- 运行`ohpm install`安装依赖

**问题2: Context类型错误**
```
Error: Parameter error. Incorrect parameter types.
```
**解决方法**: 
- 确保传入的context是UIAbilityContext类型
- 使用`this.getUIContext().getHostContext()`获取正确的Context
- 不要使用ApplicationContext或其他不支持的Context类型

**问题3: 权限配置缺失**
```
Error: App has not applied for the Wear Engine service.
```
**解决方法**: 
- 检查module.json5中是否配置了所需权限
- 确认已在华为开发者平台申请接入Wear Engine服务
- 确认申请的权限类型已在服务接入申请中审批通过

**问题4: 设备能力检查失败**
```
Error: Capability not supported.
```
**解决方法**: 
- 使用`canIUse('SystemCapability.Health.WearEngine')`检查设备是否支持
- 在不支持Wear Engine的设备上提供降级方案

## 常见问题与解决方法

### Q1: 用户拒绝授权后如何处理?
**原因**: 用户在授权界面点击拒绝或取消
**解决方法**:
- `requestAuthorization`会返回用户已授权的权限列表(可能为空数组)
- 检查返回的`result.permissions`数组长度
- 如果必要权限未授予,提示用户功能受限或引导用户到系统设置手动授权
- 避免频繁重复申请权限,以免骚扰用户

### Q2: 如何判断是否需要重新申请权限?
**原因**: 用户可能之前已授权部分权限
**解决方法**:
- 先调用`getAuthorization()`查询已授权权限
- 对比已授权权限和所需权限
- 只申请缺失的权限,避免重复弹出授权界面
- 参考"步骤4: 完整示例"中的`ensurePermissions`方法

### Q3: 为什么返回错误码1008500004?
**原因**: 应用未申请接入Wear Engine服务
**解决方法**:
- 在华为开发者平台申请接入Wear Engine服务
- 等待服务审批通过后再调用API
- 参考[申请接入Wear Engine服务](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/wearengine_apply)

### Q4: 设备不支持Wear Engine怎么办?
**原因**: 在非Phone/Tablet设备上调用API
**解决方法**:
- 使用`canIUse('SystemCapability.Health.WearEngine')`检查设备能力
- 在不支持Wear Engine的设备上隐藏相关功能入口
- 提供降级方案或提示用户更换设备

### Q5: 如何处理多设备场景?
**原因**: 用户可能绑定多个穿戴设备
**解决方法**:
- 权限是针对应用级别的,不是针对设备级别
- 申请一次权限后,可以访问所有已绑定设备的数据
- 使用`getConnectedDevices()`获取已绑定设备列表
- 每个设备的数据访问需要单独检查设备能力

### Q6: 用户未登录华为账号怎么办?
**原因**: Wear Engine服务依赖华为账号体系
**解决方法**:
- 调用`requestAuthorization`时会自动拉起登录界面
- 用户取消登录会返回错误码1008500008
- 提示用户需要登录华为账号才能使用功能
- 可以引导用户到系统设置中登录华为账号

## 输出结果报告

执行完成后输出以下信息:

```typescript
interface AuthorizationResult {
  // 授权状态
  status: 'success' | 'partial' | 'denied' | 'error';
  
  // 已授权的权限列表
  authorizedPermissions: wearEngine.Permission[];
  
  // 申请的权限列表
  requestedPermissions: wearEngine.Permission[];
  
  // 错误信息(如有)
  error?: {
    code: number;
    message: string;
  };
  
  // 使用的API列表
  apiUsed: string[];
}

// 示例输出
{
  status: 'success',
  authorizedPermissions: [
    wearEngine.Permission.USER_STATUS,
    wearEngine.Permission.HEALTH_SENSOR
  ],
  requestedPermissions: [
    wearEngine.Permission.USER_STATUS,
    wearEngine.Permission.HEALTH_SENSOR
  ],
  apiUsed: [
    'wearEngine.getAuthClient',
    'authClient.requestAuthorization'
  ]
}
```

## 参考文档

- [API开发指南 - 请求用户授权](references/request_user_authorization.md)
- [API参考文档 - wearEngine](references/wearengine_api.md)
- [申请接入Wear Engine服务](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/wearengine_apply)

## 完整示例代码

- [ArkTS示例 - 权限申请和查询](assets/wear_engine_auth_example.ets)
- [ArkTS示例 - 权限管理工具类](assets/wear_engine_auth_helper.ets)
- [配置示例 - module.json5权限配置](assets/module_config.json)

## 测试用例

### 正向测试用例
- [申请单个权限成功](tests/test_positive.ets): 测试申请USER_STATUS权限成功场景
- [申请多个权限成功](tests/test_positive.ets): 测试同时申请多个权限成功场景
- [查询已授权权限](tests/test_positive.ets): 测试查询已授权权限列表成功场景
- [重复申请权限](tests/test_positive.ets): 测试已授权权限不会重复弹出授权界面

### 边界测试用例
- [申请空权限列表](tests/test_boundary.ets): 测试申请空权限数组的边界情况
- [申请全部权限](tests/test_boundary.ets): 测试申请所有支持的权限类型
- [部分权限授权](tests/test_boundary.ets): 测试用户只授权部分权限的场景

### 异常测试用例
- [未登录华为账号](tests/test_exception.ets): 测试未登录账号时的错误处理
- [网络不可用](tests/test_exception.ets): 测试网络错误时的降级处理
- [未申请Wear Engine服务](tests/test_exception.ets): 测试未申请服务时的错误处理
- [不支持的设备类型](tests/test_exception.ets): 测试在非Phone/Tablet设备上的错误处理
- [参数错误](tests/test_exception.ets): 测试传入错误参数时的错误处理

Attribution

IsKenKenYaIsKenKenYa
View sourceMore from IsKenKenYa →
SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments (0)

No comments yet. Be the first to comment!

SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Related Skills

Browser Extension Developer

Use this skill when developing or maintaining browser extension code in the `browser/` directory, including Chrome/Firefox/Edge compatibility, content scripts, background scripts, or i18n updates.

284072 votes

Seo Optimizer

SEO optimization with keyword analysis, readability assessment, technical validation, content quality. Use for search rankings, blog posts, content audits, or encountering keyword density, readability scores, meta tags, schema markup errors.

2192 votes

Google Official Seo Guide

Official Google SEO guide covering search optimization, best practices, Search Console, crawling, indexing, and improving website search visibility based on official Google documentation

1862 votes

Tanstack Start

Build a full-stack TanStack Start app on Cloudflare Workers from scratch — SSR, file-based routing, server functions, D1+Drizzle, better-auth, Tailwind v4+shadcn/ui. Use whenever the user mentions TanStack Start, asks to scaffold a full-stack Cloudflare app with SSR, wants an SSR dashboard, or asks for a React 19 + Cloudflare Workers app with file-based routing and server functions — even if they don't name TanStack Start specifically. No template repo — Claude generates every file fresh per ...

9881 votes

Pentest

PTES-aligned adversarial security audit for backend, frontend, and mobile applications. Produces a CVSS-scored Hacker Report with verified PoCs and phased remediation.

5491 votes
View all in development →