Files
youle_app_zhuoyitong/guides/原生调用JavaScript接口文档/TSGame_JSBridge_原生调用JavaScript.md
2026-02-16 18:24:19 +08:00

50 KiB
Raw Permalink Blame History

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通知分享结果包括成功、失败、取消等状态。

工作流程

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状态

参数规范

标准数据格式

{
    "success": 1,
    "type": 2
}

参数说明

参数 类型 必需 说明 取值
success number 分享结果状态 1=成功, 0=失败, -1=取消
type number 分享平台类型 1=微信好友, 2=微信朋友圈, 3=QQ好友, 4=QQ空间, 5=微博

调用时机

  • 分享操作完成后立即调用
  • 收到分享平台SDK回调后调用
  • 不要在分享操作开始时调用
  • 不要重复调用

接口调用示例

成功分享调用

sharesuccess('{"success": 1, "type": 2}');

失败分享调用

sharesuccess('{"success": 0, "type": 1}');

取消分享调用

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: 保存用户信息

参数规范

标准数据格式

{
    "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"

调用时机

  • 微信授权成功且获取用户信息后
  • 微信登录流程完全结束后
  • 不要在授权过程中调用
  • 不要在获取用户信息失败时调用

接口调用示例

微信登录成功调用

sharelogin('{"openid": "ox7w6s_abc123def456", "headimgurl": "https://thirdwx.qlogo.cn/mmopen/vi_32/xxx.jpg", "nickname": "游戏玩家", "sex": "1", "city": "深圳", "province": "广东", "unionid": "oGRTHuB4Y_abc123def456"}');

最小必需信息调用

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返回数据

参数规范

标准数据格式

{
    "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请求

接口调用示例

完整设备信息调用

getphoneinfo('{"PhoneVersion": "Android 12", "PhoneAdresseMAC": "02:00:00:00:00:00", "PhoneModel": "SM-G9910", "PhoneDeviceBrand": "samsung", "PhoneProvidersName": "中国移动", "PhoneIMEI": "863123456789012", "PhoneIMSI": "460123456789012"}');

基本设备信息调用

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)

参数规范

标准数据格式

// 直接传递数字参数
appservice("1");  // 前台状态
appservice("2");  // 后台状态

参数说明

参数值 含义 触发场景
"1" 前台状态 App回到前台、屏幕解锁、用户交互
"2" 后台状态 App切换到后台、屏幕锁定、电话来电

调用时机

  • Activity.onResume() - 应用恢复前台
  • Activity.onPause() - 应用进入后台
  • 屏幕锁定/解锁事件
  • 电话状态变化时

接口调用示例

应用回到前台

appservice("1");

应用进入后台

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: 显示录音消息

参数规范

成功时数据格式

{
    "audiourl": "http://gameaudio.daoqi88.cn/audio_20231201_143022.amr",
    "time": 3.5
}

重置时数据格式

{
    "audiourl": "",
    "time": 0
}

参数说明

参数 类型 必需 说明 示例值
audiourl string 录音文件URL空字符串表示重置 "http://gameaudio.daoqi88.cn/xxx.amr"
time number 录音时长(秒)0表示重置 3.5

调用时机

  • 录音上传成功后立即调用
  • 录音被取消或重置时调用(传空值)
  • 不要在录音过程中调用
  • 不要在上传失败时传递错误URL

接口调用示例

录音上传成功

getaudiourl('{"audiourl": "http://gameaudio.daoqi88.cn/audio_20231201_143022.amr", "time": 3.5}');

录音重置/取消

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 参数

// 直接传递用户位置参数
gameui_play_voice("2");  // 播放用户位置2的语音

gameui_stop_voice 参数

// 直接传递用户位置参数
gameui_stop_voice("2");  // 停止用户位置2的语音

参数说明

参数 类型 必需 说明 示例值
userPosition string 用户在游戏中的位置标识 "1", "2", "3", "4"

调用时机

gameui_play_voice调用时机:

  • 开始播放语音文件时立即调用
  • 语音播放器准备就绪后调用
  • 不要在播放结束时调用

gameui_stop_voice调用时机:

  • 语音播放完成时调用
  • 用户主动停止播放时调用
  • 播放出错需要停止时调用

接口调用示例

开始播放语音

gameui_play_voice("2");  // 播放用户位置2的语音

停止播放语音

gameui_stop_voice("2");  // 停止用户位置2的语音

多用户语音控制

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)

参数规范

标准数据格式

// 直接传递状态码
phonestate("0");  // 空闲状态
phonestate("1");  // 来电状态  
phonestate("2");  // 通话状态

参数说明

状态码 含义 说明 游戏处理建议
"0" CALL_STATE_IDLE 空闲/挂断电话 恢复游戏
"1" CALL_STATE_RINGING 来电响铃 暂停游戏
"2" CALL_STATE_OFFHOOK 通话中 暂停游戏

调用时机

  • 电话状态监听器检测到状态变化时
  • 系统广播电话状态变化时
  • 不要重复发送相同状态
  • 不要在状态未确认变化时调用

接口调用示例

电话空闲状态

phonestate("0");  // 电话挂断或空闲

电话来电状态

phonestate("1");  // 电话响铃

电话通话状态

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: 更新电量显示

主动电量查询流程

sequenceDiagram
    participant WebView as WebView
    participant App as App
    participant System as 系统
    
    WebView->>App: 调用getbattery请求
    App->>System: 获取电池状态
    System->>App: 返回电量信息
    App->>App: 计算电量百分比
    App->>WebView: 调用getBattery返回结果

参数规范

标准数据格式

// 直接传递电量百分比字符串
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请求获取当前电量

// WebView端发起请求
window.jsBridge.callHandler('getbattery', null, function(response) {
    // 处理返回的电量信息
});

2. App返回电量 (getBattery)

App通过此接口向WebView返回电量信息

// App调用WebView的getBattery接口
getBattery("0.75");  // 返回75%电量

接口调用示例

高电量通知

getBattery("0.90");  // 90%电量

中等电量通知

getBattery("0.45");  // 45%电量

低电量警告

getBattery("0.15");  // 15%电量,需要提醒充电

满电状态

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信息。

工作流程

自动信号强度通知流程

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信息查询流程

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返回结果

参数规范

标准数据格式

{
    "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信息

// WebView端发起请求
window.jsBridge.callHandler('getwifiLevel', null, function(response) {
    // 处理返回的WiFi信息
});

2. App返回WiFi信息 (getwifiLevel响应)

App通过此接口向WebView返回WiFi信息

// App调用WebView的getwifiLevel接口
getwifiLevel('{"ssidname": "MyHome_WiFi_5G", "signalLevel": 4}');

接口调用示例

强信号WiFi

getwifiLevel('{"ssidname": "MyHome_WiFi_5G", "signalLevel": 4}');

中等信号WiFi

getwifiLevel('{"ssidname": "Office_Network", "signalLevel": 2}');

弱信号WiFi

getwifiLevel('{"ssidname": "Public_WiFi", "signalLevel": 1}');

无WiFi连接

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基本信息

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);

广播监听注册

// 注册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也可以主动请求获取当前网络连接状态。

工作流程

自动网络状态通知流程

sequenceDiagram
    participant System as 系统
    participant App as App
    participant WebView as WebView
    
    System->>App: 网络状态变化广播
    App->>App: 检测网络连接状态
    App->>App: 判断网络类型
    App->>WebView: 调用getnetwork
    WebView->>WebView: 更新网络状态显示

主动网络状态查询流程

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返回结果

参数规范

标准数据格式

// 直接传递网络类型代码字符串
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请求获取当前网络状态

// WebView端发起请求
window.jsBridge.callHandler('getnetwork', '', function(response) {
    // 处理返回的网络状态
    console.log('当前网络状态:', response);
});

2. App返回网络状态 (getnetwork响应)

App通过此接口向WebView返回网络状态

// App调用WebView的getnetwork接口
getnetwork("2");  // 返回WiFi连接状态

接口调用示例

WiFi网络连接

getnetwork("2");  // WiFi连接状态

移动网络连接

getnetwork("3");  // 移动网络连接状态

网络断开

getnetwork("1");  // 网络断开状态

网络状态检测逻辑

网络连接状态判断流程

// 1. 检查网络是否连接
boolean isConnected = isNetworkConnected(context);

if (!isConnected) {
    return "1";  // 网络断开
}

// 2. 检查是否为WiFi连接
boolean isWiFi = isNetworkAvailable(context);

if (isWiFi) {
    return "2";  // WiFi连接
} else {
    return "3";  // 移动网络连接
}

网络类型检测方法

// 检查网络是否连接
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;
}

网络状态广播监听

广播接收器实现

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);
        }
    }
}

广播监听注册

// 注册网络状态变化监听
MyNetReceiver myNetReceiver = new MyNetReceiver();
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(myNetReceiver, filter);

应用场景和处理建议

不同网络状态的处理策略

网络状态 处理策略 具体建议
网络断开(1) 离线模式 显示网络错误提示,缓存用户操作,禁用网络请求
WiFi连接(2) 高质量模式 启用高清图片/视频,自动更新,无流量限制
移动网络(3) 节省模式 压缩图片,询问大文件下载,显示流量提醒

WebView端处理示例

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提供详细的地理位置信息包括经纬度、地址描述、行政区划等数据。

工作流程

自动位置信息通知流程

sequenceDiagram
    participant System as 定位系统
    participant App as App
    participant WebView as WebView
    
    System->>App: 位置变化回调
    App->>App: 解析位置数据
    App->>App: 构造MaplocationInfo对象
    App->>WebView: 调用getlocationinfo
    WebView->>WebView: 更新位置显示

主动位置信息查询流程

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返回结果

参数规范

标准数据格式

{
    "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请求获取当前位置信息

// WebView端发起请求
window.jsBridge.callHandler('getlocationinfo', '', function(response) {
    // 处理返回的位置信息
    const locationData = JSON.parse(response);
    console.log('当前位置:', locationData);
});

2. App返回位置信息 (getlocationinfo响应)

App通过此接口向WebView返回位置信息

// App调用WebView的getlocationinfo接口
getlocationinfo('{"latitude": 22.543096, "longitude": 114.057865, "address": "广东省深圳市南山区科技园南区深南大道9988号", "country": "中国", "province": "广东省", "city": "深圳市", "district": "南山区", "street": "深南大道", "cityCode": "0755"}');

接口调用示例

深圳地区位置信息

getlocationinfo('{"latitude": 22.543096, "longitude": 114.057865, "address": "广东省深圳市南山区科技园南区深南大道9988号", "country": "中国", "province": "广东省", "city": "深圳市", "district": "南山区", "street": "深南大道", "cityCode": "0755"}');

北京地区位置信息

getlocationinfo('{"latitude": 39.908692, "longitude": 116.397477, "address": "北京市东城区东长安街1号", "country": "中国", "province": "北京市", "city": "北京市", "district": "东城区", "street": "东长安街", "cityCode": "010"}');

上海地区位置信息

getlocationinfo('{"latitude": 31.230416, "longitude": 121.473701, "address": "上海市黄浦区南京东路20号", "country": "中国", "province": "上海市", "city": "上海市", "district": "黄浦区", "street": "南京东路", "cityCode": "021"}');

位置信息不可用时

getlocationinfo('null');  // 定位失败或位置信息不可用

位置信息获取流程

定位服务初始化

// 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();

位置信息解析

// 位置变化回调处理
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秒

权限和隐私处理

必需权限

<!-- 精确位置权限 -->
<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" />

权限检查流程

// 检查位置权限
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 网络连接异常 检查网络连接

异常处理示例

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返回结果的数据传递。

工作流程

页面加载完成后数据传递流程

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结果返回数据传递流程

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: 处理返回的数据

参数规范

标准数据格式

// 直接传递字符串数据
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未准备好时调用

接口调用示例

用户登录信息传递

getWebdata('{"action":"user_login","userId":"12345","userName":"张三","avatar":"https://example.com/avatar.jpg","loginTime":"2025-01-13 14:30:00"}');

游戏数据传递

getWebdata('{"action":"game_data","gameId":"niuniu","currentScore":1500,"highScore":3200,"level":"expert","coins":5000}');

简单状态传递

getWebdata("page_refresh_complete");

配置信息传递

getWebdata('{"action":"app_config","theme":"dark","language":"zh-CN","soundEnabled":true,"notificationEnabled":false}');

错误信息传递

getWebdata('{"action":"error","errorCode":"E001","errorMessage":"网络连接失败","timestamp":"2025-01-13 14:30:00"}');

数据传递场景

1. 页面初始化数据传递

使用场景: WebView页面加载完成后需要获取初始数据

// 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

// 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

// 应用状态变化时调用
private void notifyAppStateChange(String newState) {
    String stateData = '{"action":"app_state_change","state":"' + newState + '"}';
    x5webview.callHandler("getWebdata", stateData, null);
}

数据处理建议

WebView端数据处理

// 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);
}

数据验证机制

// 数据有效性验证
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未准备好时调用 确保页面加载完成后调用
数据过大 传递的数据量过大 分批传递或压缩数据

异常处理示例

// 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
联系方式: 技术支持组