# TSGame JSBridge 接口文档 - 系统功能与交互

**版本**: v1.9  
**更新时间**: 2025年7月13日  
**文档类型**: 接口规范文档 - 第二部分

## 文档说明

本文档是TSGame JSBridge接口规范文档的第二部分，专注于系统功能与交互相关接口，包括剪贴板操作、游戏状态管理、设备状态检测等功能。

**适用平台**: Android / HarmonyOS  
**接口范围**: 剪贴板操作、游戏管理、设备状态检测

### 本文档包含的接口

| 接口名称 | 调用方向 | 主要功能 | 使用场景 |
|----------|----------|----------|----------|
| `gameCopytext` | WebView→App | 复制文本到剪贴板 | 文本复制分享功能 |
| `gamepastetext` | WebView→App | 获取剪贴板内容 | 文本粘贴读取功能 |
| `getGameinstall` | WebView→App | 检查游戏安装状态 | 本地游戏文件检测 |
| `getphonestate` | WebView→App | 获取电话通话状态 | 通话状态检测 |
| `SwitchOverGameData` | WebView→App | 启动指定游戏 | 游戏切换和启动 |
| `backgameData` | WebView→App | 返回数据到上级页面 | 页面数据回传 |

---

## 1. 文本复制接口 (gameCopytext)

### 接口概述
当WebView需要将文本内容复制到系统剪贴板时，通过此接口实现跨应用的文本复制功能，用户可以在其他应用中粘贴使用。

### 工作流程
```mermaid
sequenceDiagram
    participant User as 用户
    participant WebView as WebView
    participant App as App
    participant Clipboard as 系统剪贴板
    participant System as 系统
    
    User->>WebView: 触发复制操作
    WebView->>App: 调用gameCopytext接口
    App->>App: 接收要复制的文本
    App->>Clipboard: 写入文本到剪贴板
    Clipboard->>System: 更新系统剪贴板
    App->>WebView: 返回复制结果
    WebView->>User: 显示复制成功提示
```

### 参数规范

#### 调用格式
```javascript
WebViewJavascriptBridge.callHandler('gameCopytext', textContent, function(response) {
    console.log('文本复制结果:', response);
});
```

#### 参数说明
| 参数 | 类型 | 必需 | 说明 | 示例值 |
|------|------|------|------|--------|
| textContent | string | ✓ | 要复制的文本内容 | "邀请码: ABC123" |

### 接口调用示例

#### 复制邀请码
```javascript
function copyInviteCode(code) {
    const copyText = `邀请码: ${code}`;
    
    WebViewJavascriptBridge.callHandler('gameCopytext', copyText, function(response) {
        if (response === 'success') {
            showMessage('邀请码已复制到剪贴板');
        } else {
            showMessage('复制失败，请重试');
        }
    });
}
```

#### 复制游戏链接
```javascript
function copyGameLink(gameId) {
    const gameLink = `https://game.example.com/play/${gameId}`;
    
    WebViewJavascriptBridge.callHandler('gameCopytext', gameLink, function(response) {
        if (response === 'success') {
            showMessage('游戏链接已复制');
        } else {
            showMessage('复制失败');
        }
    });
}
```

### HarmonyOS实现要点
- **接口名称**: `gameCopytext`
- **调用方向**: WebView → App
- **参数格式**: 字符串类型的文本内容
- **权限要求**: 无特殊权限要求
- **错误处理**: 返回success/failure状态

---

## 2. 获取剪贴板内容接口 (gamepastetext)

### 接口概述
当WebView需要读取系统剪贴板中的文本内容时，通过此接口获取用户复制的文本数据，常用于邀请码输入等场景。

### 工作流程
```mermaid
sequenceDiagram
    participant User as 用户
    participant WebView as WebView
    participant App as App
    participant Clipboard as 系统剪贴板
    
    User->>WebView: 触发粘贴操作
    WebView->>App: 调用gamepastetext接口
    App->>Clipboard: 读取剪贴板内容
    Clipboard->>App: 返回文本内容
    App->>WebView: 回传文本内容
    WebView->>WebView: 处理粘贴的文本
    WebView->>User: 显示粘贴内容
```

### 参数规范

#### 调用格式
```javascript
WebViewJavascriptBridge.callHandler('gamepastetext', '', function(clipboardText) {
    console.log('剪贴板内容:', clipboardText);
});
```

#### 参数说明
| 参数 | 类型 | 必需 | 说明 | 取值 |
|------|------|------|------|------|
| data | string | ✓ | 固定传入空字符串 | "" |

### 接口调用示例

#### 智能邀请码输入
```javascript
function smartPasteInviteCode() {
    WebViewJavascriptBridge.callHandler('gamepastetext', '', function(clipboardText) {
        if (clipboardText) {
            // 检查是否包含邀请码格式
            const inviteCodeMatch = clipboardText.match(/[A-Z0-9]{6,10}/);
            
            if (inviteCodeMatch) {
                const inviteCode = inviteCodeMatch[0];
                document.getElementById('inviteCodeInput').value = inviteCode;
                showMessage('已自动填入邀请码: ' + inviteCode);
            } else {
                showMessage('剪贴板中没有找到有效的邀请码');
            }
        } else {
            showMessage('剪贴板为空');
        }
    });
}
```

#### 通用文本粘贴
```javascript
function pasteTextToInput(inputId) {
    WebViewJavascriptBridge.callHandler('gamepastetext', '', function(clipboardText) {
        if (clipboardText) {
            const inputElement = document.getElementById(inputId);
            if (inputElement) {
                inputElement.value = clipboardText;
                inputElement.focus();
                showMessage('已粘贴文本');
            }
        } else {
            showMessage('剪贴板中没有文本内容');
        }
    });
}
```

### HarmonyOS实现要点
- **接口名称**: `gamepastetext`
- **调用方向**: WebView → App
- **参数格式**: 空字符串
- **权限要求**: 可能需要剪贴板读取权限
- **返回数据**: 直接返回剪贴板中的文本内容

---

## 3. 游戏安装状态检查接口 (getGameinstall)

### 接口概述
检查指定游戏是否已在设备上安装，用于判断是否需要下载游戏资源或显示不同的操作按钮。

### 工作流程
```mermaid
sequenceDiagram
    participant WebView as WebView
    participant App as App
    participant FileSystem as 文件系统
    participant GameFiles as 游戏文件
    
    WebView->>App: 调用getGameinstall接口
    App->>App: 解析游戏ID参数
    App->>FileSystem: 检查游戏安装路径
    FileSystem->>GameFiles: 验证游戏文件完整性
    GameFiles->>FileSystem: 返回文件状态
    FileSystem->>App: 返回安装状态
    App->>WebView: 回传安装结果
    WebView->>WebView: 更新UI显示
```

### 参数规范

#### 调用格式
```javascript
WebViewJavascriptBridge.callHandler('getGameinstall', gameId, function(isInstalled) {
    console.log('游戏安装状态:', isInstalled);
});
```

#### 参数说明
| 参数 | 类型 | 必需 | 说明 | 示例值 |
|------|------|------|------|--------|
| gameId | string | ✓ | 游戏标识符 | "game_001", "poker", "landlord" |

#### 返回值说明
| 返回值 | 含义 |
|--------|------|
| "true" | 游戏已安装 |
| "false" | 游戏未安装 |

### 接口调用示例

#### 游戏状态检查器
```javascript
const GameStatusChecker = {
    // 检查单个游戏状态
    checkGameStatus(gameId, callback) {
        WebViewJavascriptBridge.callHandler('getGameinstall', gameId, function(isInstalled) {
            const status = isInstalled === 'true';
            console.log(`游戏 ${gameId} 安装状态:`, status);
            
            if (callback) {
                callback(gameId, status);
            }
        });
    },
    
    // 批量检查游戏状态
    checkMultipleGames(gameIds, callback) {
        const results = {};
        let completed = 0;
        
        gameIds.forEach(gameId => {
            this.checkGameStatus(gameId, (id, isInstalled) => {
                results[id] = isInstalled;
                completed++;
                
                if (completed === gameIds.length) {
                    callback(results);
                }
            });
        });
    },
    
    // 更新游戏列表UI
    updateGameListUI(gameStatuses) {
        Object.keys(gameStatuses).forEach(gameId => {
            const gameElement = document.getElementById(`game_${gameId}`);
            const isInstalled = gameStatuses[gameId];
            
            if (gameElement) {
                const button = gameElement.querySelector('.game-action-btn');
                
                if (isInstalled) {
                    button.textContent = '开始游戏';
                    button.className = 'game-action-btn btn-play';
                    button.onclick = () => this.startGame(gameId);
                } else {
                    button.textContent = '下载游戏';
                    button.className = 'game-action-btn btn-download';
                    button.onclick = () => this.downloadGame(gameId);
                }
            }
        });
    },
    
    // 启动游戏
    startGame(gameId) {
        // 调用游戏启动接口
        WebViewJavascriptBridge.callHandler('SwitchOverGameData', gameId, function(response) {
            console.log(`游戏 ${gameId} 启动请求已发送`);
        });
    },
    
    // 下载游戏
    downloadGame(gameId) {
        showMessage(`开始下载游戏: ${gameId}`);
        // 实现游戏下载逻辑
    }
};

// 页面加载时检查所有游戏状态
document.addEventListener('DOMContentLoaded', function() {
    const gameIds = ['poker', 'landlord', 'mahjong', 'chess'];
    
    GameStatusChecker.checkMultipleGames(gameIds, function(results) {
        GameStatusChecker.updateGameListUI(results);
    });
});
```

### HarmonyOS实现要点
- **接口名称**: `getGameinstall`
- **调用方向**: WebView → App
- **参数格式**: 字符串类型的游戏ID
- **文件检查**: 验证游戏文件完整性和版本
- **返回格式**: 字符串"true"或"false"

---

## 4. 电话状态检测接口 (getphonestate)

### 接口概述
获取设备当前的电话通话状态，用于在通话期间暂停游戏或调整音频设置，确保良好的用户体验。

### 工作流程
```mermaid
sequenceDiagram
    participant WebView as WebView
    participant App as App
    participant TelephonyService as 电话服务
    participant PhoneState as 通话状态
    
    WebView->>App: 调用getphonestate接口
    App->>TelephonyService: 查询电话状态
    TelephonyService->>PhoneState: 获取当前通话状态
    PhoneState->>TelephonyService: 返回状态信息
    TelephonyService->>App: 回传电话状态
    App->>WebView: 返回状态结果
    WebView->>WebView: 根据状态调整应用行为
```

### 参数规范

#### 调用格式
```javascript
WebViewJavascriptBridge.callHandler('getphonestate', '', function(phoneState) {
    console.log('电话状态:', phoneState);
});
```

#### 参数说明
| 参数 | 类型 | 必需 | 说明 | 取值 |
|------|------|------|------|------|
| data | string | ✓ | 固定传入空字符串 | "" |

#### 返回值说明
| 返回值 | 含义 |
|--------|------|
| "0" | 空闲状态（无通话） |
| "1" | 响铃状态（来电） |
| "2" | 通话中状态 |

### 接口调用示例

#### 通话状态监控器
```javascript
const PhoneStateMonitor = {
    currentState: null,
    monitoringInterval: null,
    
    // 开始监控电话状态
    startMonitoring() {
        this.checkPhoneState();
        
        // 每2秒检查一次电话状态
        this.monitoringInterval = setInterval(() => {
            this.checkPhoneState();
        }, 2000);
    },
    
    // 停止监控
    stopMonitoring() {
        if (this.monitoringInterval) {
            clearInterval(this.monitoringInterval);
            this.monitoringInterval = null;
        }
    },
    
    // 检查电话状态
    checkPhoneState() {
        WebViewJavascriptBridge.callHandler('getphonestate', '', (phoneState) => {
            const newState = parseInt(phoneState);
            
            if (newState !== this.currentState) {
                this.handleStateChange(this.currentState, newState);
                this.currentState = newState;
            }
        });
    },
    
    // 处理状态变化
    handleStateChange(oldState, newState) {
        console.log(`电话状态变化: ${oldState} -> ${newState}`);
        
        switch (newState) {
            case 0: // 空闲状态
                this.onPhoneIdle();
                break;
            case 1: // 响铃状态
                this.onPhoneRinging();
                break;
            case 2: // 通话中
                this.onPhoneInCall();
                break;
        }
    },
    
    // 电话空闲时
    onPhoneIdle() {
        console.log('电话空闲，恢复游戏');
        this.resumeGame();
        this.restoreAudio();
    },
    
    // 电话响铃时
    onPhoneRinging() {
        console.log('电话响铃，暂停游戏');
        this.pauseGame();
        this.muteAudio();
    },
    
    // 通话中时
    onPhoneInCall() {
        console.log('通话中，保持游戏暂停');
        this.pauseGame();
        this.muteAudio();
    },
    
    // 暂停游戏
    pauseGame() {
        // 暂停游戏逻辑
        const gameContainer = document.getElementById('gameContainer');
        if (gameContainer) {
            gameContainer.style.display = 'none';
        }
        
        // 显示通话提示
        this.showCallNotification();
    },
    
    // 恢复游戏
    resumeGame() {
        // 恢复游戏逻辑
        const gameContainer = document.getElementById('gameContainer');
        if (gameContainer) {
            gameContainer.style.display = 'block';
        }
        
        // 隐藏通话提示
        this.hideCallNotification();
    },
    
    // 静音音频
    muteAudio() {
        // 设置音效为关闭
        WebViewJavascriptBridge.callHandler('voicePlaying', '0', function(response) {
            console.log('音效已静音');
        });
    },
    
    // 恢复音频
    restoreAudio() {
        // 恢复之前的音效设置
        WebViewJavascriptBridge.callHandler('voicePlaying', '1', function(response) {
            console.log('音效已恢复');
        });
    },
    
    // 显示通话提示
    showCallNotification() {
        let notification = document.getElementById('callNotification');
        if (!notification) {
            notification = document.createElement('div');
            notification.id = 'callNotification';
            notification.className = 'call-notification';
            notification.innerHTML = `
                <div class="notification-content">
                    <h3>通话中</h3>
                    <p>游戏已暂停，通话结束后将自动恢复</p>
                </div>
            `;
            document.body.appendChild(notification);
        }
        notification.style.display = 'block';
    },
    
    // 隐藏通话提示
    hideCallNotification() {
        const notification = document.getElementById('callNotification');
        if (notification) {
            notification.style.display = 'none';
        }
    }
};

// 页面加载时开始监控
document.addEventListener('DOMContentLoaded', function() {
    PhoneStateMonitor.startMonitoring();
});

// 页面卸载时停止监控
window.addEventListener('beforeunload', function() {
    PhoneStateMonitor.stopMonitoring();
});
```

### HarmonyOS实现要点
- **接口名称**: `getphonestate`
- **调用方向**: WebView → App
- **参数格式**: 空字符串
- **权限要求**: 需要READ_PHONE_STATE权限
- **状态值**: 返回0/1/2表示不同的通话状态

---

## 5. 游戏启动接口 (SwitchOverGameData)

### 接口概述
启动指定的游戏应用或切换到其他游戏模块，支持传递启动参数和配置信息。

### 工作流程
```mermaid
sequenceDiagram
    participant User as 用户
    participant WebView as WebView
    participant App as App
    participant GameEngine as 游戏引擎
    participant GameModule as 游戏模块
    
    User->>WebView: 选择游戏
    WebView->>App: 调用SwitchOverGameData接口
    App->>App: 解析游戏ID和参数
    App->>GameEngine: 初始化游戏引擎
    GameEngine->>GameModule: 加载指定游戏模块
    GameModule->>GameEngine: 返回加载状态
    GameEngine->>App: 游戏启动完成
    App->>WebView: 返回启动结果
```

### 参数规范

#### 调用格式
```javascript
WebViewJavascriptBridge.callHandler('SwitchOverGameData', gameConfig, function(response) {
    console.log('游戏启动结果:', response);
});
```

#### 参数说明
| 参数 | 类型 | 必需 | 说明 | 示例值 |
|------|------|------|------|--------|
| gameConfig | string | ✓ | 游戏配置信息 | "poker" 或 JSON配置字符串 |

### 接口调用示例

#### 启动扑克游戏
```javascript
function startPokerGame() {
    WebViewJavascriptBridge.callHandler('SwitchOverGameData', 'poker', function(response) {
        if (response === 'success') {
            console.log('扑克游戏启动成功');
        } else {
            showMessage('游戏启动失败，请重试');
        }
    });
}
```

#### 带参数启动游戏
```javascript
function startGameWithParams(gameId, gameMode, playerCount) {
    const gameConfig = JSON.stringify({
        gameId: gameId,
        mode: gameMode,
        players: playerCount,
        timestamp: Date.now()
    });
    
    WebViewJavascriptBridge.callHandler('SwitchOverGameData', gameConfig, function(response) {
        console.log('游戏启动配置已发送');
    });
}
```

### HarmonyOS实现要点
- **接口名称**: `SwitchOverGameData`
- **调用方向**: WebView → App
- **参数格式**: 游戏ID字符串或JSON配置
- **游戏管理**: 需要游戏模块加载和切换机制
- **错误处理**: 处理游戏启动失败的情况

---

## 6. 页面数据返回接口 (backgameData)

### 接口概述
当子页面需要向上级页面传递数据时，通过此接口实现页面间的数据回传，常用于设置页面、选择页面等场景。

### 工作流程
```mermaid
sequenceDiagram
    participant ChildPage as 子页面
    participant App as App
    participant ParentPage as 父页面
    participant DataHandler as 数据处理器
    
    ChildPage->>App: 调用backgameData接口
    App->>App: 接收返回数据
    App->>DataHandler: 解析数据格式
    DataHandler->>App: 验证数据完整性
    App->>ParentPage: 传递数据到父页面
    ParentPage->>ParentPage: 处理返回数据
    App->>ChildPage: 关闭子页面
```

### 参数规范

#### 调用格式
```javascript
const returnData = {
    type: "settings",
    data: {
        username: "新用户名",
        avatar: "avatar_url"
    }
};

WebViewJavascriptBridge.callHandler('backgameData', JSON.stringify(returnData), function(response) {
    console.log('数据返回成功');
});
```

#### 参数说明
| 参数 | 类型 | 必需 | 说明 | 示例值 |
|------|------|------|------|--------|
| returnData | string | ✓ | JSON格式的返回数据 | JSON字符串 |

### 接口调用示例

#### 设置页面数据返回
```javascript
function saveSettingsAndReturn() {
    const settingsData = {
        type: "userSettings",
        data: {
            username: document.getElementById('username').value,
            avatar: document.getElementById('avatar').src,
            theme: document.querySelector('input[name="theme"]:checked').value,
            notifications: document.getElementById('notifications').checked
        },
        timestamp: Date.now()
    };
    
    WebViewJavascriptBridge.callHandler('backgameData', JSON.stringify(settingsData), function(response) {
        console.log('设置已保存并返回');
        // 页面将被自动关闭
    });
}
```

#### 游戏选择结果返回
```javascript
function selectGameAndReturn(gameId, gameMode) {
    const selectionData = {
        type: "gameSelection",
        data: {
            selectedGame: gameId,
            gameMode: gameMode,
            difficulty: document.getElementById('difficulty').value
        }
    };
    
    WebViewJavascriptBridge.callHandler('backgameData', JSON.stringify(selectionData), function(response) {
        console.log('游戏选择已确认');
    });
}
```

### HarmonyOS实现要点
- **接口名称**: `backgameData`
- **调用方向**: WebView → App
- **参数格式**: JSON字符串格式的数据
- **页面管理**: 数据传递后通常会关闭当前页面
- **数据验证**: 需要验证返回数据的格式和完整性

---

## 文档关联

本文档是TSGame JSBridge接口规范的第二部分，完整文档包括：

1. **用户认证与页面管理** - 登录、页面跳转、语音控制
2. **系统功能与交互** (本文档) - 剪贴板、游戏状态、设备检测
3. **位置与媒体服务** - GPS定位、音频播放

---

**文档维护**: TSGame开发团队  
**最后更新**: 2025年7月13日  
**版本**: v1.9  
**联系方式**: 技术支持组
