1650 lines
50 KiB
Markdown
1650 lines
50 KiB
Markdown
# TSGame JSBridge 原生调用JavaScript接口规范文档
|
||
|
||
## 文档说明
|
||
|
||
本文档详细描述TSGame游戏中App原生调用WebView JavaScript的所有JSBridge接口规范。专注于接口工作流程、参数格式、调用时机等核心规范,便于开发者准确复制接口功能到HarmonyOS应用中。
|
||
|
||
**适用平台**: Android / HarmonyOS
|
||
**文档类型**: 接口规范文档
|
||
**文档版本**: v2.2
|
||
**更新日期**: 2025年7月13日
|
||
|
||
### 接口分类
|
||
|
||
| 接口名称 | 调用方向 | 主要功能 | 调用频率 |
|
||
|----------|----------|----------|----------|
|
||
| `sharesuccess` | App→WebView | 分享结果通知 | 按需调用 |
|
||
| `sharelogin` | App→WebView | 微信登录回调 | 按需调用 |
|
||
| `getphoneinfo` | App→WebView | 设备信息返回 | 按需调用 |
|
||
| `appservice` | App→WebView | 前后台状态通知 | 自动调用 |
|
||
| `getaudiourl` | App→WebView | 录音上传结果 | 按需调用 |
|
||
| `gameui_play_voice` | App→WebView | 语音播放控制 | 按需调用 |
|
||
| `gameui_stop_voice` | App→WebView | 语音停止控制 | 按需调用 |
|
||
| `phonestate` | App→WebView | 电话状态通知 | 自动调用 |
|
||
| `getBattery` | App→WebView | 电池电量通知 | 自动调用/按需调用 |
|
||
| `getwifiLevel` | App→WebView | WiFi信号强度通知 | 自动调用/按需调用 |
|
||
| `getnetwork` | App→WebView | 网络连接状态通知 | 自动调用/按需调用 |
|
||
| `getlocationinfo` | App→WebView | 位置信息通知 | 按需调用/自动调用 |
|
||
| `getWebdata` | App→WebView | 页面数据传递 | 按需调用 |
|
||
|
||
---
|
||
|
||
## 1. 分享结果通知接口 (sharesuccess)
|
||
|
||
### 接口概述
|
||
当用户完成分享操作后,App通过此接口向WebView通知分享结果,包括成功、失败、取消等状态。
|
||
|
||
### 工作流程
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant User as 用户
|
||
participant App as App
|
||
participant Platform as 分享平台
|
||
participant WebView as WebView
|
||
|
||
User->>App: 触发分享
|
||
App->>Platform: 调用分享SDK
|
||
Platform->>User: 显示分享界面
|
||
User->>Platform: 完成/取消分享
|
||
Platform->>App: 返回分享结果
|
||
App->>WebView: 调用sharesuccess
|
||
WebView->>WebView: 更新UI状态
|
||
```
|
||
|
||
### 参数规范
|
||
|
||
#### 标准数据格式
|
||
```json
|
||
{
|
||
"success": 1,
|
||
"type": 2
|
||
}
|
||
```
|
||
|
||
#### 参数说明
|
||
| 参数 | 类型 | 必需 | 说明 | 取值 |
|
||
|------|------|------|------|------|
|
||
| success | number | ✓ | 分享结果状态 | 1=成功, 0=失败, -1=取消 |
|
||
| type | number | ✓ | 分享平台类型 | 1=微信好友, 2=微信朋友圈, 3=QQ好友, 4=QQ空间, 5=微博 |
|
||
|
||
#### 调用时机
|
||
- ✅ 分享操作完成后立即调用
|
||
- ✅ 收到分享平台SDK回调后调用
|
||
- ❌ 不要在分享操作开始时调用
|
||
- ❌ 不要重复调用
|
||
|
||
### 接口调用示例
|
||
|
||
#### 成功分享调用
|
||
```javascript
|
||
sharesuccess('{"success": 1, "type": 2}');
|
||
```
|
||
|
||
#### 失败分享调用
|
||
```javascript
|
||
sharesuccess('{"success": 0, "type": 1}');
|
||
```
|
||
|
||
#### 取消分享调用
|
||
```javascript
|
||
sharesuccess('{"success": -1, "type": 3}');
|
||
```
|
||
```
|
||
|
||
### HarmonyOS实现要点
|
||
- 接口名称: `sharesuccess`
|
||
- 调用方式: 通过WebView的JavaScript执行接口调用
|
||
- 数据格式: JSON字符串或JavaScript对象
|
||
- 调用时机: 分享操作完成后立即调用
|
||
|
||
---
|
||
|
||
## 2. 微信登录回调接口 (sharelogin)
|
||
|
||
### 接口概述
|
||
微信登录完成后,App通过此接口向WebView传递用户信息,包括用户头像、昵称、openid等数据。
|
||
|
||
### 工作流程
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant User as 用户
|
||
participant App as App
|
||
participant WeChat as 微信
|
||
participant WebView as WebView
|
||
|
||
User->>App: 点击微信登录
|
||
App->>WeChat: 调用微信授权
|
||
WeChat->>User: 显示授权页面
|
||
User->>WeChat: 确认授权
|
||
WeChat->>App: 返回授权码
|
||
App->>WeChat: 获取用户信息
|
||
WeChat->>App: 返回用户数据
|
||
App->>WebView: 调用sharelogin
|
||
WebView->>WebView: 保存用户信息
|
||
```
|
||
|
||
### 参数规范
|
||
|
||
#### 标准数据格式
|
||
```json
|
||
{
|
||
"openid": "ox7w6s_abc123def456",
|
||
"headimgurl": "https://thirdwx.qlogo.cn/mmopen/vi_32/xxx.jpg",
|
||
"nickname": "游戏玩家",
|
||
"sex": "1",
|
||
"city": "深圳",
|
||
"province": "广东",
|
||
"unionid": "oGRTHuB4Y_abc123def456"
|
||
}
|
||
```
|
||
|
||
#### 参数说明
|
||
| 参数 | 类型 | 必需 | 说明 | 示例值 |
|
||
|------|------|------|------|--------|
|
||
| openid | string | ✓ | 微信用户唯一标识 | "ox7w6s_abc123def456" |
|
||
| headimgurl | string | ✓ | 用户头像URL | "https://thirdwx.qlogo.cn/..." |
|
||
| nickname | string | ✓ | 用户昵称 | "游戏玩家" |
|
||
| sex | string | ✓ | 性别 | "1"=男, "2"=女, "0"=未知 |
|
||
| city | string | ○ | 用户所在城市 | "深圳" |
|
||
| province | string | ○ | 用户所在省份 | "广东" |
|
||
| unionid | string | ○ | UnionID标识 | "oGRTHuB4Y_abc123def456" |
|
||
|
||
#### 调用时机
|
||
- ✅ 微信授权成功且获取用户信息后
|
||
- ✅ 微信登录流程完全结束后
|
||
- ❌ 不要在授权过程中调用
|
||
- ❌ 不要在获取用户信息失败时调用
|
||
|
||
### 接口调用示例
|
||
|
||
#### 微信登录成功调用
|
||
```javascript
|
||
sharelogin('{"openid": "ox7w6s_abc123def456", "headimgurl": "https://thirdwx.qlogo.cn/mmopen/vi_32/xxx.jpg", "nickname": "游戏玩家", "sex": "1", "city": "深圳", "province": "广东", "unionid": "oGRTHuB4Y_abc123def456"}');
|
||
```
|
||
|
||
#### 最小必需信息调用
|
||
```javascript
|
||
sharelogin('{"openid": "ox7w6s_abc123def456", "headimgurl": "https://thirdwx.qlogo.cn/mmopen/vi_32/xxx.jpg", "nickname": "游戏玩家", "sex": "1"}');
|
||
```
|
||
```
|
||
|
||
### HarmonyOS实现要点
|
||
- 接口名称: `sharelogin`
|
||
- 调用方式: 微信登录完成后调用此接口传递用户信息
|
||
- 数据格式: JSON格式的用户信息对象
|
||
- 必需字段: openid, headimgurl, nickname, sex
|
||
|
||
---
|
||
|
||
## 3. 设备信息返回接口 (getphoneinfo)
|
||
|
||
### 接口概述
|
||
当WebView请求设备信息后,App通过此接口返回设备的硬件和系统信息。
|
||
|
||
### 工作流程
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant WebView as WebView
|
||
participant App as App
|
||
participant System as 系统API
|
||
|
||
WebView->>App: 调用getphoneinfo
|
||
App->>System: 获取系统版本
|
||
App->>System: 获取设备型号
|
||
App->>System: 获取MAC地址
|
||
App->>System: 获取运营商信息
|
||
System->>App: 返回各项信息
|
||
App->>WebView: 调用getphoneinfo返回数据
|
||
```
|
||
|
||
### 参数规范
|
||
|
||
#### 标准数据格式
|
||
```json
|
||
{
|
||
"PhoneVersion": "Android 12",
|
||
"PhoneAdresseMAC": "02:00:00:00:00:00",
|
||
"PhoneModel": "SM-G9910",
|
||
"PhoneDeviceBrand": "samsung",
|
||
"PhoneProvidersName": "中国移动",
|
||
"PhoneIMEI": "863123456789012",
|
||
"PhoneIMSI": "460123456789012"
|
||
}
|
||
```
|
||
|
||
#### 参数说明
|
||
| 参数 | 类型 | 必需 | 说明 | 示例值 |
|
||
|------|------|------|------|--------|
|
||
| PhoneVersion | string | ✓ | 系统版本信息 | "Android 12" / "HarmonyOS 5.0" |
|
||
| PhoneAdresseMAC | string | ✓ | 设备MAC地址 | "02:00:00:00:00:00" |
|
||
| PhoneModel | string | ✓ | 设备型号 | "SM-G9910" |
|
||
| PhoneDeviceBrand | string | ✓ | 设备品牌 | "samsung" / "HUAWEI" |
|
||
| PhoneProvidersName | string | ✓ | 运营商名称 | "中国移动" |
|
||
| PhoneIMEI | string | ○ | 设备IMEI | "863123456789012" |
|
||
| PhoneIMSI | string | ○ | SIM卡IMSI | "460123456789012" |
|
||
|
||
#### 调用时机
|
||
- ✅ 响应WebView的getphoneinfo请求时调用
|
||
- ✅ 设备信息收集完成后立即调用
|
||
- ❌ 不要主动调用,仅响应WebView请求
|
||
|
||
### 接口调用示例
|
||
|
||
#### 完整设备信息调用
|
||
```javascript
|
||
getphoneinfo('{"PhoneVersion": "Android 12", "PhoneAdresseMAC": "02:00:00:00:00:00", "PhoneModel": "SM-G9910", "PhoneDeviceBrand": "samsung", "PhoneProvidersName": "中国移动", "PhoneIMEI": "863123456789012", "PhoneIMSI": "460123456789012"}');
|
||
```
|
||
|
||
#### 基本设备信息调用
|
||
```javascript
|
||
getphoneinfo('{"PhoneVersion": "HarmonyOS 5.0", "PhoneAdresseMAC": "02:00:00:00:00:00", "PhoneModel": "Mate 60", "PhoneDeviceBrand": "HUAWEI", "PhoneProvidersName": "中国移动"}');
|
||
```
|
||
```
|
||
|
||
### HarmonyOS实现要点
|
||
- 接口名称: `getphoneinfo`
|
||
- 调用方式: 响应WebView请求时调用此接口返回设备信息
|
||
- 数据格式: 包含设备信息的JSON对象
|
||
- 必需字段: PhoneVersion, PhoneModel, PhoneDeviceBrand, PhoneAdresseMAC, PhoneProvidersName
|
||
|
||
---
|
||
|
||
## 4. 应用状态通知接口 (appservice)
|
||
|
||
### 接口概述
|
||
App前后台状态发生变化时,通过此接口通知WebView,便于游戏暂停/恢复等处理。
|
||
|
||
### 工作流程
|
||
```mermaid
|
||
stateDiagram-v2
|
||
[*] --> 前台状态
|
||
前台状态 --> 后台状态: 应用切换到后台
|
||
后台状态 --> 前台状态: 应用切换到前台
|
||
前台状态 --> 前台状态: 屏幕解锁
|
||
后台状态 --> 后台状态: 屏幕锁定
|
||
|
||
前台状态: 发送 appservice(1)
|
||
后台状态: 发送 appservice(2)
|
||
```
|
||
|
||
### 参数规范
|
||
|
||
#### 标准数据格式
|
||
```javascript
|
||
// 直接传递数字参数
|
||
appservice("1"); // 前台状态
|
||
appservice("2"); // 后台状态
|
||
```
|
||
|
||
#### 参数说明
|
||
| 参数值 | 含义 | 触发场景 |
|
||
|--------|------|----------|
|
||
| "1" | 前台状态 | App回到前台、屏幕解锁、用户交互 |
|
||
| "2" | 后台状态 | App切换到后台、屏幕锁定、电话来电 |
|
||
|
||
#### 调用时机
|
||
- ✅ Activity.onResume() - 应用恢复前台
|
||
- ✅ Activity.onPause() - 应用进入后台
|
||
- ✅ 屏幕锁定/解锁事件
|
||
- ✅ 电话状态变化时
|
||
|
||
### 接口调用示例
|
||
|
||
#### 应用回到前台
|
||
```javascript
|
||
appservice("1");
|
||
```
|
||
|
||
#### 应用进入后台
|
||
```javascript
|
||
appservice("2");
|
||
```
|
||
```
|
||
|
||
### HarmonyOS实现要点
|
||
- 接口名称: `appservice`
|
||
- 调用方式: 应用前后台状态变化时自动调用
|
||
- 参数格式: 字符串类型的状态值
|
||
- 状态值: "1"=前台状态, "2"=后台状态
|
||
|
||
---
|
||
|
||
## 5. 录音结果通知接口 (getaudiourl)
|
||
|
||
### 接口概述
|
||
用户完成录音后,App将录音文件上传到云端,然后通过此接口返回录音文件的URL和时长信息。
|
||
|
||
### 工作流程
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant User as 用户
|
||
participant WebView as WebView
|
||
participant App as App
|
||
participant Cloud as 云存储
|
||
|
||
User->>WebView: 开始录音
|
||
WebView->>App: 调用prepareaudio
|
||
App->>App: 开始录音
|
||
User->>App: 结束录音
|
||
App->>Cloud: 上传录音文件
|
||
Cloud->>App: 返回文件URL
|
||
App->>WebView: 调用getaudiourl
|
||
WebView->>WebView: 显示录音消息
|
||
```
|
||
|
||
### 参数规范
|
||
|
||
#### 成功时数据格式
|
||
```json
|
||
{
|
||
"audiourl": "http://gameaudio.daoqi88.cn/audio_20231201_143022.amr",
|
||
"time": 3.5
|
||
}
|
||
```
|
||
|
||
#### 重置时数据格式
|
||
```json
|
||
{
|
||
"audiourl": "",
|
||
"time": 0
|
||
}
|
||
```
|
||
|
||
#### 参数说明
|
||
| 参数 | 类型 | 必需 | 说明 | 示例值 |
|
||
|------|------|------|------|--------|
|
||
| audiourl | string | ✓ | 录音文件URL,空字符串表示重置 | "http://gameaudio.daoqi88.cn/xxx.amr" |
|
||
| time | number | ✓ | 录音时长(秒),0表示重置 | 3.5 |
|
||
|
||
#### 调用时机
|
||
- ✅ 录音上传成功后立即调用
|
||
- ✅ 录音被取消或重置时调用(传空值)
|
||
- ❌ 不要在录音过程中调用
|
||
- ❌ 不要在上传失败时传递错误URL
|
||
|
||
### 接口调用示例
|
||
|
||
#### 录音上传成功
|
||
```javascript
|
||
getaudiourl('{"audiourl": "http://gameaudio.daoqi88.cn/audio_20231201_143022.amr", "time": 3.5}');
|
||
```
|
||
|
||
#### 录音重置/取消
|
||
```javascript
|
||
getaudiourl('{"audiourl": "", "time": 0}');
|
||
```
|
||
```
|
||
|
||
### HarmonyOS实现要点
|
||
- 接口名称: `getaudiourl`
|
||
- 调用方式: 录音上传完成后调用此接口通知结果
|
||
- 数据格式: 包含录音URL和时长的JSON对象
|
||
- 重置调用: 传递空URL和0时长表示录音重置
|
||
|
||
---
|
||
|
||
## 6. 语音播放控制接口 (gameui_play_voice / gameui_stop_voice)
|
||
|
||
### 接口概述
|
||
控制游戏中语音消息的播放和停止,包括显示播放动画和停止播放效果。
|
||
|
||
### 工作流程 - 播放语音
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant User as 用户
|
||
participant App as App
|
||
participant WebView as WebView
|
||
participant Audio as 音频引擎
|
||
|
||
User->>App: 点击语音消息
|
||
App->>Audio: 开始播放音频
|
||
App->>WebView: 调用gameui_play_voice
|
||
WebView->>WebView: 显示播放动画
|
||
Audio->>App: 播放完成
|
||
App->>WebView: 调用gameui_stop_voice
|
||
WebView->>WebView: 停止播放动画
|
||
```
|
||
|
||
### 参数规范
|
||
|
||
#### gameui_play_voice 参数
|
||
```javascript
|
||
// 直接传递用户位置参数
|
||
gameui_play_voice("2"); // 播放用户位置2的语音
|
||
```
|
||
|
||
#### gameui_stop_voice 参数
|
||
```javascript
|
||
// 直接传递用户位置参数
|
||
gameui_stop_voice("2"); // 停止用户位置2的语音
|
||
```
|
||
|
||
#### 参数说明
|
||
| 参数 | 类型 | 必需 | 说明 | 示例值 |
|
||
|------|------|------|------|--------|
|
||
| userPosition | string | ✓ | 用户在游戏中的位置标识 | "1", "2", "3", "4" |
|
||
|
||
#### 调用时机
|
||
**gameui_play_voice调用时机:**
|
||
- ✅ 开始播放语音文件时立即调用
|
||
- ✅ 语音播放器准备就绪后调用
|
||
- ❌ 不要在播放结束时调用
|
||
|
||
**gameui_stop_voice调用时机:**
|
||
- ✅ 语音播放完成时调用
|
||
- ✅ 用户主动停止播放时调用
|
||
- ✅ 播放出错需要停止时调用
|
||
|
||
### 接口调用示例
|
||
|
||
#### 开始播放语音
|
||
```javascript
|
||
gameui_play_voice("2"); // 播放用户位置2的语音
|
||
```
|
||
|
||
#### 停止播放语音
|
||
```javascript
|
||
gameui_stop_voice("2"); // 停止用户位置2的语音
|
||
```
|
||
|
||
#### 多用户语音控制
|
||
```javascript
|
||
gameui_play_voice("1"); // 用户1开始播放
|
||
gameui_play_voice("3"); // 用户3开始播放
|
||
gameui_stop_voice("1"); // 用户1停止播放
|
||
gameui_stop_voice("3"); // 用户3停止播放
|
||
```
|
||
```
|
||
|
||
### HarmonyOS实现要点
|
||
- 接口名称: `gameui_play_voice` / `gameui_stop_voice`
|
||
- 调用方式: 语音播放开始时调用play接口,播放结束时调用stop接口
|
||
- 参数格式: 字符串类型的用户位置标识
|
||
- 位置标识: "1", "2", "3", "4", "5", "6" 等数字字符串
|
||
|
||
---
|
||
|
||
## 7. 电话状态通知接口 (phonestate)
|
||
|
||
### 接口概述
|
||
当设备电话状态发生变化时,App通过此接口通知WebView,便于游戏在通话时暂停。
|
||
|
||
### 工作流程
|
||
```mermaid
|
||
stateDiagram-v2
|
||
[*] --> 空闲状态
|
||
空闲状态 --> 来电状态: 电话来电
|
||
来电状态 --> 通话状态: 接听电话
|
||
来电状态 --> 空闲状态: 拒绝/未接
|
||
通话状态 --> 空闲状态: 挂断电话
|
||
|
||
空闲状态: 发送 phonestate(0)
|
||
来电状态: 发送 phonestate(1)
|
||
通话状态: 发送 phonestate(2)
|
||
```
|
||
|
||
### 参数规范
|
||
|
||
#### 标准数据格式
|
||
```javascript
|
||
// 直接传递状态码
|
||
phonestate("0"); // 空闲状态
|
||
phonestate("1"); // 来电状态
|
||
phonestate("2"); // 通话状态
|
||
```
|
||
|
||
#### 参数说明
|
||
| 状态码 | 含义 | 说明 | 游戏处理建议 |
|
||
|--------|------|------|--------------|
|
||
| "0" | CALL_STATE_IDLE | 空闲/挂断电话 | 恢复游戏 |
|
||
| "1" | CALL_STATE_RINGING | 来电响铃 | 暂停游戏 |
|
||
| "2" | CALL_STATE_OFFHOOK | 通话中 | 暂停游戏 |
|
||
|
||
#### 调用时机
|
||
- ✅ 电话状态监听器检测到状态变化时
|
||
- ✅ 系统广播电话状态变化时
|
||
- ❌ 不要重复发送相同状态
|
||
- ❌ 不要在状态未确认变化时调用
|
||
|
||
### 接口调用示例
|
||
|
||
#### 电话空闲状态
|
||
```javascript
|
||
phonestate("0"); // 电话挂断或空闲
|
||
```
|
||
|
||
#### 电话来电状态
|
||
```javascript
|
||
phonestate("1"); // 电话响铃
|
||
```
|
||
|
||
#### 电话通话状态
|
||
```javascript
|
||
phonestate("2"); // 正在通话
|
||
```
|
||
```
|
||
|
||
### HarmonyOS实现要点
|
||
- 接口名称: `phonestate`
|
||
- 调用方式: 电话状态变化时自动调用此接口
|
||
- 参数格式: 字符串类型的状态码
|
||
- 状态码: "0"=空闲, "1"=来电响铃, "2"=通话中
|
||
|
||
---
|
||
|
||
## 8. 电池电量通知接口 (getBattery)
|
||
|
||
### 接口概述
|
||
当设备电池电量发生变化时,App自动通过此接口通知WebView当前电量百分比。同时WebView也可以主动请求获取当前电量信息。
|
||
|
||
### 工作流程
|
||
|
||
#### 自动电量通知流程
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant System as 系统
|
||
participant App as App
|
||
participant WebView as WebView
|
||
|
||
System->>App: 电量变化广播
|
||
App->>App: 计算电量百分比
|
||
App->>WebView: 调用getBattery
|
||
WebView->>WebView: 更新电量显示
|
||
```
|
||
|
||
#### 主动电量查询流程
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant WebView as WebView
|
||
participant App as App
|
||
participant System as 系统
|
||
|
||
WebView->>App: 调用getbattery请求
|
||
App->>System: 获取电池状态
|
||
System->>App: 返回电量信息
|
||
App->>App: 计算电量百分比
|
||
App->>WebView: 调用getBattery返回结果
|
||
```
|
||
|
||
### 参数规范
|
||
|
||
#### 标准数据格式
|
||
```javascript
|
||
// 直接传递电量百分比字符串
|
||
getBattery("0.85"); // 85%电量
|
||
getBattery("0.42"); // 42%电量
|
||
getBattery("1.0"); // 100%电量
|
||
```
|
||
|
||
#### 参数说明
|
||
| 参数 | 类型 | 必需 | 说明 | 示例值 |
|
||
|------|------|------|------|--------|
|
||
| batteryLevel | string | ✓ | 电池电量百分比(小数形式) | "0.85" (表示85%), "0.42" (表示42%) |
|
||
|
||
#### 调用时机
|
||
**自动调用时机:**
|
||
- ✅ 设备电量发生变化时自动调用
|
||
- ✅ 电池状态广播接收时调用
|
||
- ✅ 充电状态变化时调用
|
||
|
||
**主动调用时机:**
|
||
- ✅ 响应WebView的getbattery请求时调用
|
||
- ✅ 应用启动时获取初始电量
|
||
- ❌ 不要频繁主动调用,避免性能影响
|
||
|
||
### 双向接口说明
|
||
|
||
#### 1. WebView请求电量 (getbattery)
|
||
WebView向App请求获取当前电量:
|
||
```javascript
|
||
// WebView端发起请求
|
||
window.jsBridge.callHandler('getbattery', null, function(response) {
|
||
// 处理返回的电量信息
|
||
});
|
||
```
|
||
|
||
#### 2. App返回电量 (getBattery)
|
||
App通过此接口向WebView返回电量信息:
|
||
```javascript
|
||
// App调用WebView的getBattery接口
|
||
getBattery("0.75"); // 返回75%电量
|
||
```
|
||
|
||
### 接口调用示例
|
||
|
||
#### 高电量通知
|
||
```javascript
|
||
getBattery("0.90"); // 90%电量
|
||
```
|
||
|
||
#### 中等电量通知
|
||
```javascript
|
||
getBattery("0.45"); // 45%电量
|
||
```
|
||
|
||
#### 低电量警告
|
||
```javascript
|
||
getBattery("0.15"); // 15%电量,需要提醒充电
|
||
```
|
||
|
||
#### 满电状态
|
||
```javascript
|
||
getBattery("1.0"); // 100%满电
|
||
```
|
||
|
||
### 电量计算逻辑
|
||
|
||
#### 电量百分比计算
|
||
```
|
||
batteryPct = level / scale
|
||
```
|
||
|
||
其中:
|
||
- `level`: 当前电量值
|
||
- `scale`: 电量最大值
|
||
- `batteryPct`: 电量百分比(0.0-1.0)
|
||
|
||
#### 示例计算
|
||
```
|
||
当前电量 level = 85
|
||
最大电量 scale = 100
|
||
电量百分比 = 85/100 = 0.85
|
||
调用: getBattery("0.85")
|
||
```
|
||
|
||
### HarmonyOS实现要点
|
||
- 接口名称: `getBattery` (App→WebView), `getbattery` (WebView→App请求)
|
||
- 调用方式: 电量变化时自动调用,或响应WebView主动请求
|
||
- 参数格式: 字符串类型的电量百分比(小数形式)
|
||
- 监听机制: 注册电量变化广播接收器,实时监听电量状态
|
||
- 计算方式: level/scale得到0.0-1.0之间的小数值
|
||
|
||
---
|
||
|
||
## 9. WiFi信号强度通知接口 (getwifiLevel)
|
||
|
||
### 接口概述
|
||
当设备WiFi信号强度发生变化时,App自动通过此接口通知WebView当前WiFi信号强度和网络名称。同时WebView也可以主动请求获取当前WiFi信息。
|
||
|
||
### 工作流程
|
||
|
||
#### 自动信号强度通知流程
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant System as 系统
|
||
participant App as App
|
||
participant WebView as WebView
|
||
|
||
System->>App: WiFi信号变化广播
|
||
App->>App: 获取WiFi信息
|
||
App->>App: 计算信号强度等级
|
||
App->>WebView: 调用getwifiLevel
|
||
WebView->>WebView: 更新信号显示
|
||
```
|
||
|
||
#### 主动WiFi信息查询流程
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant WebView as WebView
|
||
participant App as App
|
||
participant System as 系统
|
||
|
||
WebView->>App: 调用getwifiLevel请求
|
||
App->>System: 获取WiFi连接状态
|
||
App->>System: 获取信号强度RSSI
|
||
System->>App: 返回WiFi信息
|
||
App->>App: 计算信号强度等级
|
||
App->>WebView: 调用getwifiLevel返回结果
|
||
```
|
||
|
||
### 参数规范
|
||
|
||
#### 标准数据格式
|
||
```json
|
||
{
|
||
"ssidname": "MyHome_WiFi_5G",
|
||
"signalLevel": 4
|
||
}
|
||
```
|
||
|
||
#### 参数说明
|
||
| 参数 | 类型 | 必需 | 说明 | 示例值 |
|
||
|------|------|------|------|--------|
|
||
| ssidname | string | ✓ | WiFi网络名称(SSID) | "MyHome_WiFi_5G", "OfficeNetwork" |
|
||
| signalLevel | number | ✓ | 信号强度等级(0-4) | 0=最弱, 1=弱, 2=一般, 3=强, 4=最强 |
|
||
|
||
#### 调用时机
|
||
**自动调用时机:**
|
||
- ✅ WiFi信号强度变化时自动调用(RSSI_CHANGED_ACTION广播)
|
||
- ✅ WiFi连接状态变化时调用
|
||
- ✅ 切换WiFi网络时调用
|
||
|
||
**主动调用时机:**
|
||
- ✅ 响应WebView的getwifiLevel请求时调用
|
||
- ✅ 应用启动时获取初始WiFi信息
|
||
- ❌ 不要频繁主动调用,避免性能影响
|
||
|
||
### 双向接口说明
|
||
|
||
#### 1. WebView请求WiFi信息 (getwifiLevel请求)
|
||
WebView向App请求获取当前WiFi信息:
|
||
```javascript
|
||
// WebView端发起请求
|
||
window.jsBridge.callHandler('getwifiLevel', null, function(response) {
|
||
// 处理返回的WiFi信息
|
||
});
|
||
```
|
||
|
||
#### 2. App返回WiFi信息 (getwifiLevel响应)
|
||
App通过此接口向WebView返回WiFi信息:
|
||
```javascript
|
||
// App调用WebView的getwifiLevel接口
|
||
getwifiLevel('{"ssidname": "MyHome_WiFi_5G", "signalLevel": 4}');
|
||
```
|
||
|
||
### 接口调用示例
|
||
|
||
#### 强信号WiFi
|
||
```javascript
|
||
getwifiLevel('{"ssidname": "MyHome_WiFi_5G", "signalLevel": 4}');
|
||
```
|
||
|
||
#### 中等信号WiFi
|
||
```javascript
|
||
getwifiLevel('{"ssidname": "Office_Network", "signalLevel": 2}');
|
||
```
|
||
|
||
#### 弱信号WiFi
|
||
```javascript
|
||
getwifiLevel('{"ssidname": "Public_WiFi", "signalLevel": 1}');
|
||
```
|
||
|
||
#### 无WiFi连接
|
||
```javascript
|
||
getwifiLevel('{"ssidname": "", "signalLevel": 0}');
|
||
```
|
||
|
||
### 信号强度计算逻辑
|
||
|
||
#### 信号强度等级计算
|
||
```
|
||
signalLevel = WifiManager.calculateSignalLevel(rssi, 5)
|
||
```
|
||
|
||
其中:
|
||
- `rssi`: WiFi信号强度原始值(负数,如-50dBm)
|
||
- `5`: 信号等级分档数量(0-4共5个等级)
|
||
- `signalLevel`: 信号强度等级(0-4)
|
||
|
||
#### 信号强度等级说明
|
||
| 等级 | 信号质量 | RSSI范围(大概) | 说明 |
|
||
|------|----------|----------------|------|
|
||
| 0 | 无信号/很弱 | < -80dBm | 无法正常使用 |
|
||
| 1 | 弱 | -80dBm ~ -70dBm | 连接不稳定 |
|
||
| 2 | 一般 | -70dBm ~ -60dBm | 基本可用 |
|
||
| 3 | 良好 | -60dBm ~ -50dBm | 连接稳定 |
|
||
| 4 | 优秀 | > -50dBm | 信号很强 |
|
||
|
||
### WiFi信息获取流程
|
||
|
||
#### 获取WiFi基本信息
|
||
```java
|
||
WifiManager wifiManager = getSystemService(WIFI_SERVICE);
|
||
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
|
||
|
||
// WiFi名称
|
||
String ssid = wifiInfo.getSSID();
|
||
|
||
// 信号强度RSSI值
|
||
int rssi = wifiInfo.getRssi();
|
||
|
||
// 计算信号强度等级(0-4)
|
||
int signalLevel = WifiManager.calculateSignalLevel(rssi, 5);
|
||
```
|
||
|
||
#### 广播监听注册
|
||
```java
|
||
// 注册WiFi信号变化监听
|
||
IntentFilter filter = new IntentFilter(WifiManager.RSSI_CHANGED_ACTION);
|
||
registerReceiver(wifiChangeReceiver, filter);
|
||
```
|
||
|
||
### HarmonyOS实现要点
|
||
- 接口名称: `getwifiLevel` (双向接口,同时用于请求和响应)
|
||
- 调用方式: WiFi信号变化时自动调用,或响应WebView主动请求
|
||
- 数据格式: JSON格式包含网络名称和信号强度等级
|
||
- 监听机制: 注册WiFi信号变化广播接收器(RSSI_CHANGED_ACTION)
|
||
- 信号计算: 使用系统API将RSSI值转换为0-4等级
|
||
- 权限要求: 需要ACCESS_WIFI_STATE和ACCESS_FINE_LOCATION权限
|
||
|
||
---
|
||
|
||
## 10. 网络连接状态通知接口 (getnetwork)
|
||
|
||
### 接口概述
|
||
当设备网络连接状态发生变化时,App自动通过此接口通知WebView当前网络连接类型。同时WebView也可以主动请求获取当前网络连接状态。
|
||
|
||
### 工作流程
|
||
|
||
#### 自动网络状态通知流程
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant System as 系统
|
||
participant App as App
|
||
participant WebView as WebView
|
||
|
||
System->>App: 网络状态变化广播
|
||
App->>App: 检测网络连接状态
|
||
App->>App: 判断网络类型
|
||
App->>WebView: 调用getnetwork
|
||
WebView->>WebView: 更新网络状态显示
|
||
```
|
||
|
||
#### 主动网络状态查询流程
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant WebView as WebView
|
||
participant App as App
|
||
participant System as 系统
|
||
|
||
WebView->>App: 调用getnetwork请求
|
||
App->>System: 获取网络连接信息
|
||
App->>System: 检查WiFi连接状态
|
||
App->>System: 检查移动网络状态
|
||
System->>App: 返回网络信息
|
||
App->>App: 判断网络类型
|
||
App->>WebView: 调用getnetwork返回结果
|
||
```
|
||
|
||
### 参数规范
|
||
|
||
#### 标准数据格式
|
||
```javascript
|
||
// 直接传递网络类型代码字符串
|
||
getnetwork("1"); // 网络断开
|
||
getnetwork("2"); // WiFi连接
|
||
getnetwork("3"); // 移动网络连接
|
||
```
|
||
|
||
#### 参数说明
|
||
| 参数 | 类型 | 必需 | 说明 | 示例值 |
|
||
|------|------|------|------|--------|
|
||
| networkType | string | ✓ | 网络连接类型代码 | "1"=断开, "2"=WiFi, "3"=移动网络 |
|
||
|
||
#### 网络类型说明
|
||
| 类型码 | 网络状态 | 说明 | 应用建议 |
|
||
|--------|----------|------|----------|
|
||
| "1" | 网络断开 | 无任何网络连接 | 显示离线模式,禁用网络功能 |
|
||
| "2" | WiFi连接 | 连接到WiFi网络 | 启用高质量内容,无流量限制 |
|
||
| "3" | 移动网络 | 连接到蜂窝移动网络 | 节省流量模式,压缩内容 |
|
||
|
||
#### 调用时机
|
||
**自动调用时机:**
|
||
- ✅ 网络连接状态变化时自动调用(CONNECTIVITY_ACTION广播)
|
||
- ✅ WiFi开关状态变化时调用
|
||
- ✅ 移动数据开关状态变化时调用
|
||
- ✅ 网络类型切换时调用
|
||
|
||
**主动调用时机:**
|
||
- ✅ 响应WebView的getnetwork请求时调用
|
||
- ✅ 应用启动时获取初始网络状态
|
||
- ❌ 不要频繁主动调用,避免性能影响
|
||
|
||
### 双向接口说明
|
||
|
||
#### 1. WebView请求网络状态 (getnetwork请求)
|
||
WebView向App请求获取当前网络状态:
|
||
```javascript
|
||
// WebView端发起请求
|
||
window.jsBridge.callHandler('getnetwork', '', function(response) {
|
||
// 处理返回的网络状态
|
||
console.log('当前网络状态:', response);
|
||
});
|
||
```
|
||
|
||
#### 2. App返回网络状态 (getnetwork响应)
|
||
App通过此接口向WebView返回网络状态:
|
||
```javascript
|
||
// App调用WebView的getnetwork接口
|
||
getnetwork("2"); // 返回WiFi连接状态
|
||
```
|
||
|
||
### 接口调用示例
|
||
|
||
#### WiFi网络连接
|
||
```javascript
|
||
getnetwork("2"); // WiFi连接状态
|
||
```
|
||
|
||
#### 移动网络连接
|
||
```javascript
|
||
getnetwork("3"); // 移动网络连接状态
|
||
```
|
||
|
||
#### 网络断开
|
||
```javascript
|
||
getnetwork("1"); // 网络断开状态
|
||
```
|
||
|
||
### 网络状态检测逻辑
|
||
|
||
#### 网络连接状态判断流程
|
||
```java
|
||
// 1. 检查网络是否连接
|
||
boolean isConnected = isNetworkConnected(context);
|
||
|
||
if (!isConnected) {
|
||
return "1"; // 网络断开
|
||
}
|
||
|
||
// 2. 检查是否为WiFi连接
|
||
boolean isWiFi = isNetworkAvailable(context);
|
||
|
||
if (isWiFi) {
|
||
return "2"; // WiFi连接
|
||
} else {
|
||
return "3"; // 移动网络连接
|
||
}
|
||
```
|
||
|
||
#### 网络类型检测方法
|
||
```java
|
||
// 检查网络是否连接
|
||
public static boolean isNetworkConnected(Context context) {
|
||
ConnectivityManager cm = (ConnectivityManager) context
|
||
.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||
NetworkInfo info = cm.getActiveNetworkInfo();
|
||
return info != null && info.isConnected();
|
||
}
|
||
|
||
// 检查是否为WiFi连接
|
||
public static boolean isNetworkAvailable(Context context) {
|
||
ConnectivityManager manager = (ConnectivityManager) context
|
||
.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
|
||
return networkInfo != null &&
|
||
networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
|
||
}
|
||
```
|
||
|
||
### 网络状态广播监听
|
||
|
||
#### 广播接收器实现
|
||
```java
|
||
private class MyNetReceiver extends BroadcastReceiver {
|
||
@Override
|
||
public void onReceive(Context context, Intent intent) {
|
||
String action = intent.getAction();
|
||
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
|
||
|
||
ConnectivityManager cm = (ConnectivityManager)
|
||
getSystemService(Context.CONNECTIVITY_SERVICE);
|
||
NetworkInfo netInfo = cm.getActiveNetworkInfo();
|
||
|
||
int type = 1; // 默认断开状态
|
||
|
||
if (netInfo != null && netInfo.isAvailable()) {
|
||
if (netInfo.getType() == ConnectivityManager.TYPE_WIFI) {
|
||
type = 2; // WiFi网络
|
||
} else if (netInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
|
||
type = 3; // 移动网络
|
||
}
|
||
}
|
||
|
||
// 通知WebView网络状态变化
|
||
webview.callHandler("getnetwork", String.valueOf(type), null);
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 广播监听注册
|
||
```java
|
||
// 注册网络状态变化监听
|
||
MyNetReceiver myNetReceiver = new MyNetReceiver();
|
||
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
|
||
registerReceiver(myNetReceiver, filter);
|
||
```
|
||
|
||
### 应用场景和处理建议
|
||
|
||
#### 不同网络状态的处理策略
|
||
| 网络状态 | 处理策略 | 具体建议 |
|
||
|----------|----------|----------|
|
||
| 网络断开(1) | 离线模式 | 显示网络错误提示,缓存用户操作,禁用网络请求 |
|
||
| WiFi连接(2) | 高质量模式 | 启用高清图片/视频,自动更新,无流量限制 |
|
||
| 移动网络(3) | 节省模式 | 压缩图片,询问大文件下载,显示流量提醒 |
|
||
|
||
#### WebView端处理示例
|
||
```javascript
|
||
function handleNetworkChange(networkType) {
|
||
switch(networkType) {
|
||
case "1":
|
||
// 网络断开
|
||
showOfflineMessage();
|
||
disableNetworkFeatures();
|
||
break;
|
||
case "2":
|
||
// WiFi连接
|
||
enableHighQualityMode();
|
||
hideDataWarning();
|
||
break;
|
||
case "3":
|
||
// 移动网络
|
||
enableDataSavingMode();
|
||
showDataUsageWarning();
|
||
break;
|
||
}
|
||
}
|
||
```
|
||
|
||
### HarmonyOS实现要点
|
||
- 接口名称: `getnetwork` (双向接口,同时用于请求和响应)
|
||
- 调用方式: 网络状态变化时自动调用,或响应WebView主动请求
|
||
- 参数格式: 字符串类型的网络类型代码
|
||
- 监听机制: 注册网络连接状态变化广播接收器(CONNECTIVITY_ACTION)
|
||
- 状态判断: 通过ConnectivityManager检测网络连接状态和类型
|
||
- 权限要求: 需要ACCESS_NETWORK_STATE权限
|
||
|
||
---
|
||
|
||
## 11. 位置信息通知接口 (getlocationinfo)
|
||
|
||
### 接口概述
|
||
当设备位置信息发生变化或WebView主动请求位置信息时,App通过此接口向WebView提供详细的地理位置信息,包括经纬度、地址描述、行政区划等数据。
|
||
|
||
### 工作流程
|
||
|
||
#### 自动位置信息通知流程
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant System as 定位系统
|
||
participant App as App
|
||
participant WebView as WebView
|
||
|
||
System->>App: 位置变化回调
|
||
App->>App: 解析位置数据
|
||
App->>App: 构造MaplocationInfo对象
|
||
App->>WebView: 调用getlocationinfo
|
||
WebView->>WebView: 更新位置显示
|
||
```
|
||
|
||
#### 主动位置信息查询流程
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant WebView as WebView
|
||
participant App as App
|
||
participant LocationService as 定位服务
|
||
|
||
WebView->>App: 调用getlocationinfo请求
|
||
App->>LocationService: 启动定位服务
|
||
LocationService->>LocationService: GPS/网络定位
|
||
LocationService->>App: 返回位置信息
|
||
App->>App: 构造位置数据
|
||
App->>WebView: 调用getlocationinfo返回结果
|
||
```
|
||
|
||
### 参数规范
|
||
|
||
#### 标准数据格式
|
||
```json
|
||
{
|
||
"latitude": 22.543096,
|
||
"longitude": 114.057865,
|
||
"address": "广东省深圳市南山区科技园南区深南大道9988号",
|
||
"country": "中国",
|
||
"province": "广东省",
|
||
"city": "深圳市",
|
||
"district": "南山区",
|
||
"street": "深南大道",
|
||
"cityCode": "0755"
|
||
}
|
||
```
|
||
|
||
#### 参数说明
|
||
| 参数 | 类型 | 必需 | 说明 | 示例值 |
|
||
|------|------|------|------|--------|
|
||
| latitude | number | ✓ | 纬度坐标 | 22.543096 |
|
||
| longitude | number | ✓ | 经度坐标 | 114.057865 |
|
||
| address | string | ✓ | 详细地址描述 | "广东省深圳市南山区科技园南区深南大道9988号" |
|
||
| country | string | ✓ | 国家名称 | "中国" |
|
||
| province | string | ✓ | 省份名称 | "广东省" |
|
||
| city | string | ✓ | 城市名称 | "深圳市" |
|
||
| district | string | ✓ | 城区名称 | "南山区" |
|
||
| street | string | ✓ | 街道名称 | "深南大道" |
|
||
| cityCode | string | ○ | 城市区号 | "0755" |
|
||
|
||
#### 调用时机
|
||
**自动调用时机:**
|
||
- ✅ 设备位置发生变化时自动调用(AMapLocationListener回调)
|
||
- ✅ 定位服务获取到新的位置信息时调用
|
||
- ✅ 应用启动时完成首次定位后调用
|
||
|
||
**主动调用时机:**
|
||
- ✅ 响应WebView的getlocationinfo请求时调用
|
||
- ✅ 用户手动刷新位置信息时调用
|
||
- ❌ 不要在定位权限未授权时调用
|
||
- ❌ 不要在定位服务未启动时调用
|
||
|
||
### 双向接口说明
|
||
|
||
#### 1. WebView请求位置信息 (getlocationinfo请求)
|
||
WebView向App请求获取当前位置信息:
|
||
```javascript
|
||
// WebView端发起请求
|
||
window.jsBridge.callHandler('getlocationinfo', '', function(response) {
|
||
// 处理返回的位置信息
|
||
const locationData = JSON.parse(response);
|
||
console.log('当前位置:', locationData);
|
||
});
|
||
```
|
||
|
||
#### 2. App返回位置信息 (getlocationinfo响应)
|
||
App通过此接口向WebView返回位置信息:
|
||
```javascript
|
||
// App调用WebView的getlocationinfo接口
|
||
getlocationinfo('{"latitude": 22.543096, "longitude": 114.057865, "address": "广东省深圳市南山区科技园南区深南大道9988号", "country": "中国", "province": "广东省", "city": "深圳市", "district": "南山区", "street": "深南大道", "cityCode": "0755"}');
|
||
```
|
||
|
||
### 接口调用示例
|
||
|
||
#### 深圳地区位置信息
|
||
```javascript
|
||
getlocationinfo('{"latitude": 22.543096, "longitude": 114.057865, "address": "广东省深圳市南山区科技园南区深南大道9988号", "country": "中国", "province": "广东省", "city": "深圳市", "district": "南山区", "street": "深南大道", "cityCode": "0755"}');
|
||
```
|
||
|
||
#### 北京地区位置信息
|
||
```javascript
|
||
getlocationinfo('{"latitude": 39.908692, "longitude": 116.397477, "address": "北京市东城区东长安街1号", "country": "中国", "province": "北京市", "city": "北京市", "district": "东城区", "street": "东长安街", "cityCode": "010"}');
|
||
```
|
||
|
||
#### 上海地区位置信息
|
||
```javascript
|
||
getlocationinfo('{"latitude": 31.230416, "longitude": 121.473701, "address": "上海市黄浦区南京东路20号", "country": "中国", "province": "上海市", "city": "上海市", "district": "黄浦区", "street": "南京东路", "cityCode": "021"}');
|
||
```
|
||
|
||
#### 位置信息不可用时
|
||
```javascript
|
||
getlocationinfo('null'); // 定位失败或位置信息不可用
|
||
```
|
||
|
||
### 位置信息获取流程
|
||
|
||
#### 定位服务初始化
|
||
```java
|
||
// 1. 初始化定位客户端
|
||
AMapLocationClient mLocationClient = new AMapLocationClient(context);
|
||
|
||
// 2. 配置定位参数
|
||
AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
|
||
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy); // 高精度模式
|
||
mLocationOption.setOnceLocation(true); // 单次定位
|
||
mLocationOption.setOnceLocationLatest(true); // 返回最高精度结果
|
||
mLocationOption.setNeedAddress(true); // 返回地址信息
|
||
|
||
// 3. 设置定位监听器
|
||
mLocationClient.setLocationOption(mLocationOption);
|
||
mLocationClient.setLocationListener(locationListener);
|
||
mLocationClient.startLocation();
|
||
```
|
||
|
||
#### 位置信息解析
|
||
```java
|
||
// 位置变化回调处理
|
||
public void onLocationChanged(AMapLocation amapLocation) {
|
||
MaplocationInfo location = new MaplocationInfo();
|
||
|
||
// 设置坐标信息
|
||
location.setLatitude(amapLocation.getLatitude()); // 纬度
|
||
location.setLongitude(amapLocation.getLongitude()); // 经度
|
||
|
||
// 设置地址信息
|
||
location.setAddress(amapLocation.getAddress()); // 详细地址
|
||
location.setCountry(amapLocation.getCountry()); // 国家
|
||
location.setProvince(amapLocation.getProvince()); // 省份
|
||
location.setCity(amapLocation.getCity()); // 城市
|
||
location.setDistrict(amapLocation.getDistrict()); // 城区
|
||
location.setStreet(amapLocation.getStreet()); // 街道
|
||
location.setCityCode(amapLocation.getCityCode()); // 城市编码
|
||
|
||
// 转换为JSON并通知WebView
|
||
Gson gson = new Gson();
|
||
String json = gson.toJson(location);
|
||
webview.callHandler("getlocationinfo", json, null);
|
||
}
|
||
```
|
||
|
||
### 定位模式和精度说明
|
||
|
||
#### 定位模式类型
|
||
| 模式 | 精度 | 功耗 | 说明 | 适用场景 |
|
||
|------|------|------|------|----------|
|
||
| Hight_Accuracy | 高 | 高 | GPS+网络+基站定位 | 导航、精确位置需求 |
|
||
| Battery_Saving | 中 | 低 | 网络+基站定位 | 一般位置需求 |
|
||
| Device_Sensors | 最高 | 最高 | 仅GPS定位 | 户外精确定位 |
|
||
|
||
#### 定位精度指标
|
||
| 指标 | 说明 | 典型值 |
|
||
|------|------|--------|
|
||
| 精度半径 | 定位结果的误差范围 | 10-50米 |
|
||
| 定位时间 | 首次定位完成时间 | 2-10秒 |
|
||
| 更新频率 | 位置更新的时间间隔 | 1-5秒 |
|
||
|
||
### 权限和隐私处理
|
||
|
||
#### 必需权限
|
||
```xml
|
||
<!-- 精确位置权限 -->
|
||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||
<!-- 粗略位置权限 -->
|
||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||
<!-- 网络访问权限 -->
|
||
<uses-permission android:name="android.permission.INTERNET" />
|
||
```
|
||
|
||
#### 权限检查流程
|
||
```java
|
||
// 检查位置权限
|
||
private boolean checkLocationPermission() {
|
||
return ActivityCompat.checkSelfPermission(this,
|
||
Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
|
||
}
|
||
|
||
// 请求位置权限
|
||
private void requestLocationPermission() {
|
||
ActivityCompat.requestPermissions(this,
|
||
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
|
||
LOCATION_PERMISSION_REQUEST_CODE);
|
||
}
|
||
```
|
||
|
||
### 错误处理和异常情况
|
||
|
||
#### 常见错误类型
|
||
| 错误类型 | 错误码 | 说明 | 处理建议 |
|
||
|----------|--------|------|----------|
|
||
| 权限被拒绝 | 12 | 用户拒绝位置权限 | 引导用户开启权限 |
|
||
| 定位失败 | 1 | GPS/网络定位失败 | 重试定位或使用缓存位置 |
|
||
| 服务不可用 | 2 | 定位服务暂时不可用 | 稍后重试 |
|
||
| 网络异常 | 4 | 网络连接异常 | 检查网络连接 |
|
||
|
||
#### 异常处理示例
|
||
```java
|
||
public void onLocationChanged(AMapLocation amapLocation) {
|
||
if (amapLocation != null) {
|
||
if (amapLocation.getErrorCode() == 0) {
|
||
// 定位成功,处理位置信息
|
||
processLocationData(amapLocation);
|
||
} else {
|
||
// 定位失败,处理错误
|
||
handleLocationError(amapLocation.getErrorCode(),
|
||
amapLocation.getErrorInfo());
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### HarmonyOS实现要点
|
||
- 接口名称: `getlocationinfo` (双向接口,同时用于请求和响应)
|
||
- 调用方式: 位置变化时自动调用,或响应WebView主动请求
|
||
- 数据格式: JSON格式包含完整的位置信息对象
|
||
- 定位服务: 集成高德地图定位SDK或系统定位服务
|
||
- 权限管理: 需要精确位置权限(ACCESS_FINE_LOCATION)
|
||
- 隐私保护: 遵循位置信息使用规范,明确告知用户位置用途
|
||
- 性能优化: 合理设置定位频率,避免过度消耗电量
|
||
- 错误处理: 完善的权限检查和定位失败处理机制
|
||
|
||
---
|
||
|
||
## 12. 页面数据传递接口 (getWebdata)
|
||
|
||
### 接口概述
|
||
当App需要向WebView传递数据时,通过此接口将数据传递给WebView,主要用于页面加载完成后的数据初始化、页面间的数据通信以及Activity返回结果的数据传递。
|
||
|
||
### 工作流程
|
||
|
||
#### 页面加载完成后数据传递流程
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Activity as Activity
|
||
participant WebView as WebView
|
||
participant JavaScript as JavaScript
|
||
|
||
Activity->>Activity: 获取Intent传递的data
|
||
Activity->>WebView: 页面开始加载
|
||
WebView->>WebView: 页面加载进度监控
|
||
WebView->>Activity: onProgressChanged(100%)
|
||
Activity->>JavaScript: 调用getWebdata(data)
|
||
JavaScript->>JavaScript: 处理传入的数据
|
||
```
|
||
|
||
#### Activity结果返回数据传递流程
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant SubActivity as 子Activity
|
||
participant MainActivity as 主Activity
|
||
participant WebView as WebView
|
||
participant JavaScript as JavaScript
|
||
|
||
SubActivity->>MainActivity: 返回结果(resultCode=101)
|
||
MainActivity->>MainActivity: 从Intent获取data
|
||
MainActivity->>JavaScript: 调用getWebdata(data)
|
||
JavaScript->>JavaScript: 处理返回的数据
|
||
```
|
||
|
||
### 参数规范
|
||
|
||
#### 标准数据格式
|
||
```javascript
|
||
// 直接传递字符串数据
|
||
getWebdata("userdata_12345");
|
||
|
||
// 传递JSON格式数据
|
||
getWebdata('{"userId":"12345","userName":"张三","gameLevel":10}');
|
||
|
||
// 传递游戏状态数据
|
||
getWebdata('{"gameId":"niuniu","score":1500,"level":"expert"}');
|
||
```
|
||
|
||
#### 参数说明
|
||
| 参数 | 类型 | 必需 | 说明 | 示例值 |
|
||
|------|------|------|------|--------|
|
||
| data | string | ✓ | 需要传递给WebView的数据 | 任意字符串或JSON格式数据 |
|
||
|
||
#### 数据内容类型
|
||
| 数据类型 | 用途 | 格式 | 示例 |
|
||
|----------|------|------|------|
|
||
| 用户信息 | 传递用户基本信息 | JSON字符串 | `{"userId":"12345","userName":"张三"}` |
|
||
| 游戏数据 | 传递游戏状态和设置 | JSON字符串 | `{"gameId":"niuniu","score":1500}` |
|
||
| 配置参数 | 传递应用配置信息 | JSON字符串 | `{"theme":"dark","language":"zh-CN"}` |
|
||
| 简单标识 | 传递简单的标识符 | 普通字符串 | `"user_login_success"` |
|
||
|
||
#### 调用时机
|
||
**页面加载时调用:**
|
||
- ✅ WebView页面加载完成后(onProgressChanged=100%)
|
||
- ✅ 页面首次初始化需要数据时
|
||
- ✅ 页面刷新重新加载后
|
||
|
||
**Activity返回时调用:**
|
||
- ✅ 子Activity返回结果时(onActivityResult)
|
||
- ✅ 其他页面返回数据时(resultCode=101)
|
||
- ✅ 页面间数据传递时
|
||
|
||
**数据更新时调用:**
|
||
- ✅ App状态发生变化需要通知WebView时
|
||
- ✅ 用户信息更新后需要同步时
|
||
- ❌ 不要在页面加载过程中调用
|
||
- ❌ 不要在WebView未准备好时调用
|
||
|
||
### 接口调用示例
|
||
|
||
#### 用户登录信息传递
|
||
```javascript
|
||
getWebdata('{"action":"user_login","userId":"12345","userName":"张三","avatar":"https://example.com/avatar.jpg","loginTime":"2025-01-13 14:30:00"}');
|
||
```
|
||
|
||
#### 游戏数据传递
|
||
```javascript
|
||
getWebdata('{"action":"game_data","gameId":"niuniu","currentScore":1500,"highScore":3200,"level":"expert","coins":5000}');
|
||
```
|
||
|
||
#### 简单状态传递
|
||
```javascript
|
||
getWebdata("page_refresh_complete");
|
||
```
|
||
|
||
#### 配置信息传递
|
||
```javascript
|
||
getWebdata('{"action":"app_config","theme":"dark","language":"zh-CN","soundEnabled":true,"notificationEnabled":false}');
|
||
```
|
||
|
||
#### 错误信息传递
|
||
```javascript
|
||
getWebdata('{"action":"error","errorCode":"E001","errorMessage":"网络连接失败","timestamp":"2025-01-13 14:30:00"}');
|
||
```
|
||
|
||
### 数据传递场景
|
||
|
||
#### 1. 页面初始化数据传递
|
||
**使用场景**: WebView页面加载完成后需要获取初始数据
|
||
```java
|
||
// Activity中页面加载完成后调用
|
||
@Override
|
||
public void onProgressChanged(WebView view, int newProgress) {
|
||
if (newProgress == 100 && !isLoadingFinished) {
|
||
isLoadingFinished = true;
|
||
|
||
// 传递初始化数据
|
||
String initData = '{"userId":"12345","gameMode":"multiplayer"}';
|
||
x5webview.callHandler("getWebdata", initData, null);
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 2. Activity返回结果数据传递
|
||
**使用场景**: 子Activity返回结果数据给WebView
|
||
```java
|
||
// Activity结果处理
|
||
@Override
|
||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||
if (resultCode == 101) {
|
||
Bundle bundle = data.getExtras();
|
||
String resultData = bundle.getString("data");
|
||
|
||
// 传递返回结果数据
|
||
x5webview.callHandler("getWebdata", resultData, new CallBackFunction() {
|
||
@Override
|
||
public void onCallBack(String response) {
|
||
// 处理WebView的响应
|
||
}
|
||
});
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 3. 应用状态变化数据传递
|
||
**使用场景**: App状态发生变化需要通知WebView
|
||
```java
|
||
// 应用状态变化时调用
|
||
private void notifyAppStateChange(String newState) {
|
||
String stateData = '{"action":"app_state_change","state":"' + newState + '"}';
|
||
x5webview.callHandler("getWebdata", stateData, null);
|
||
}
|
||
```
|
||
|
||
### 数据处理建议
|
||
|
||
#### WebView端数据处理
|
||
```javascript
|
||
// WebView端接收数据的处理函数
|
||
function getWebdata(data) {
|
||
try {
|
||
// 尝试解析JSON数据
|
||
const parsedData = JSON.parse(data);
|
||
|
||
// 根据action类型处理不同的数据
|
||
switch(parsedData.action) {
|
||
case 'user_login':
|
||
handleUserLogin(parsedData);
|
||
break;
|
||
case 'game_data':
|
||
handleGameData(parsedData);
|
||
break;
|
||
case 'app_config':
|
||
handleAppConfig(parsedData);
|
||
break;
|
||
default:
|
||
handleGenericData(parsedData);
|
||
}
|
||
} catch (e) {
|
||
// 非JSON数据,按字符串处理
|
||
handleStringData(data);
|
||
}
|
||
}
|
||
|
||
// 处理用户登录数据
|
||
function handleUserLogin(userData) {
|
||
document.getElementById('username').textContent = userData.userName;
|
||
document.getElementById('userId').textContent = userData.userId;
|
||
// 更新UI显示用户信息
|
||
}
|
||
|
||
// 处理游戏数据
|
||
function handleGameData(gameData) {
|
||
updateGameScore(gameData.currentScore);
|
||
updateHighScore(gameData.highScore);
|
||
updateUserLevel(gameData.level);
|
||
}
|
||
```
|
||
|
||
#### 数据验证机制
|
||
```javascript
|
||
// 数据有效性验证
|
||
function validateData(data) {
|
||
// 检查数据是否为空
|
||
if (!data || data.trim() === '') {
|
||
console.warn('Received empty data');
|
||
return false;
|
||
}
|
||
|
||
// 检查JSON格式数据的必需字段
|
||
try {
|
||
const parsedData = JSON.parse(data);
|
||
if (parsedData.action && !isValidAction(parsedData.action)) {
|
||
console.warn('Invalid action type:', parsedData.action);
|
||
return false;
|
||
}
|
||
} catch (e) {
|
||
// 非JSON数据,按字符串处理
|
||
}
|
||
|
||
return true;
|
||
}
|
||
```
|
||
|
||
### 错误处理和异常情况
|
||
|
||
#### 常见错误类型
|
||
| 错误类型 | 说明 | 处理建议 |
|
||
|----------|------|----------|
|
||
| 空数据 | 传递的data为null或空字符串 | 检查数据有效性,提供默认值 |
|
||
| JSON解析错误 | 数据格式不是有效的JSON | 按字符串处理或提供错误提示 |
|
||
| 时机错误 | 在WebView未准备好时调用 | 确保页面加载完成后调用 |
|
||
| 数据过大 | 传递的数据量过大 | 分批传递或压缩数据 |
|
||
|
||
#### 异常处理示例
|
||
```java
|
||
// App端异常处理
|
||
private void safeCallGetWebdata(String data) {
|
||
try {
|
||
if (x5webview != null && data != null) {
|
||
// 检查数据大小,避免传递过大数据
|
||
if (data.length() > MAX_DATA_SIZE) {
|
||
Log.w("GetWebdata", "Data size too large: " + data.length());
|
||
// 分批传递或压缩数据
|
||
return;
|
||
}
|
||
|
||
x5webview.callHandler("getWebdata", data, new CallBackFunction() {
|
||
@Override
|
||
public void onCallBack(String response) {
|
||
// 处理成功响应
|
||
Log.d("GetWebdata", "Data sent successfully");
|
||
}
|
||
});
|
||
} else {
|
||
Log.w("GetWebdata", "WebView not ready or data is null");
|
||
}
|
||
} catch (Exception e) {
|
||
Log.e("GetWebdata", "Error calling getWebdata", e);
|
||
}
|
||
}
|
||
```
|
||
|
||
### 性能优化建议
|
||
|
||
#### 数据传递优化
|
||
- **数据压缩**: 对于大型JSON数据,考虑使用压缩算法
|
||
- **批量传递**: 将多个小数据合并为一次传递
|
||
- **异步处理**: 使用异步方式处理数据,避免阻塞UI线程
|
||
- **缓存机制**: 对频繁使用的数据进行缓存
|
||
|
||
#### 调用频率控制
|
||
- **避免重复调用**: 检查数据是否发生变化再决定是否调用
|
||
- **节流机制**: 对于频繁的状态变化,使用节流避免过度调用
|
||
- **优先级管理**: 重要数据优先传递,非关键数据可延后
|
||
|
||
### HarmonyOS实现要点
|
||
- 接口名称: `getWebdata`
|
||
- 调用方式: App向WebView传递数据时主动调用
|
||
- 参数格式: 字符串类型,支持普通字符串和JSON格式
|
||
- 调用时机: 页面加载完成后、Activity返回结果时、应用状态变化时
|
||
- 数据处理: WebView端需要实现getWebdata函数来接收和处理数据
|
||
- 错误处理: 需要处理空数据、JSON解析错误、调用时机错误等异常情况
|
||
- 性能考虑: 控制数据大小、调用频率,使用异步处理避免阻塞
|
||
|
||
---
|
||
|
||
## 接口实现规范
|
||
|
||
### 1. 通用调用规范
|
||
- **接口调用方式**: 通过WebView的JavaScript执行接口
|
||
- **数据传递格式**: JSON字符串或JavaScript基本类型
|
||
- **字符编码**: UTF-8编码
|
||
- **调用时机**: 严格按照各接口定义的调用时机执行
|
||
|
||
### 2. 数据格式要求
|
||
- **JSON格式**: 复杂数据使用标准JSON格式
|
||
- **字符串转义**: 正确处理特殊字符和换行符
|
||
- **类型一致性**: 确保参数类型与接口定义完全匹配
|
||
- **字段完整性**: 必需字段不可缺失,可选字段可省略
|
||
|
||
### 3. 双向接口处理
|
||
- **请求响应模式**: 如getBattery、getwifiLevel、getnetwork接口支持WebView主动请求和App主动推送
|
||
- **接口命名规范**: 双向接口使用相同命名,通过调用上下文区分请求和响应
|
||
- **状态同步**: 确保双向接口的状态信息保持一致
|
||
- **频率控制**: 避免高频率的双向调用造成性能问题
|
||
|
||
### 4. 系统监听机制
|
||
- **广播接收器**: 电量、WiFi信号、电话状态、网络连接等需要注册相应的系统广播监听器
|
||
- **生命周期管理**: 正确注册和注销广播接收器,避免内存泄漏
|
||
- **权限处理**: 确保获取系统信息所需的权限已正确申请
|
||
- **异常处理**: 处理系统API调用可能出现的异常情况
|
||
|
||
### 5. 接口兼容性要求
|
||
- **接口名称**: 与Android版本保持完全一致
|
||
- **参数结构**: 参数名称、类型、取值范围保持一致
|
||
- **调用频率**: 遵循相同的调用时机和频率限制
|
||
- **错误处理**: 异常情况下的处理方式保持一致
|
||
|
||
### 6. 实现验证要点
|
||
- **功能验证**: 确保接口调用产生预期的WebView响应
|
||
- **数据验证**: 验证传递的数据格式和内容正确性
|
||
- **时序验证**: 验证接口调用的时机和顺序正确
|
||
- **兼容验证**: 确保与现有WebView代码完全兼容
|
||
|
||
---
|
||
|
||
## 版本兼容性说明
|
||
|
||
### 接口版本历史
|
||
| 版本 | 更新内容 | 影响范围 |
|
||
|------|----------|----------|
|
||
| v1.0 | 初始版本,基础接口定义 | 全部接口 |
|
||
| v1.1 | 增加错误处理参数 | sharelogin接口 |
|
||
| v2.0 | 标准化参数格式和文档 | 全部接口 |
|
||
| v2.1 | 新增getlocationinfo位置信息接口 | 位置定位功能 |
|
||
| v2.2 | 新增getWebdata页面数据传递接口 | 数据通信功能 |
|
||
|
||
### 向后兼容性
|
||
- 新版本保持对旧版本的完全兼容
|
||
- 不会删除或修改现有接口参数
|
||
- 新增参数使用可选方式,不影响现有实现
|
||
|
||
---
|
||
|
||
**文档维护**: TSGame开发团队
|
||
**最后更新**: 2025年7月13日
|
||
**版本**: v2.2
|
||
**联系方式**: 技术支持组
|