接入流程

如上图所示,云手机 SDK 的使用流程如下:
1. 通过业务后台调用云 API 获取需要在客户端中操作实例的访问 Token 及 AccessInfo。
加速腾讯云手机实例使用 CreateAndroidInstancesAccessToken 获取
加速第三方云手机实例使用 CreateAndroidInstanceAcceleratorToken 获取
说明:
2. 将获取的访问 Token 及 AccessInfo 下发给业务客户端,并调用 SDK 接口 setAccessToken 添加到云手机 SDK。
3. 业务客户端调用云手机 SDK 的接口实现连接云手机实例,具体接口及功能请参考 云手机 SDK 文档。
Web 快速接入
获取 SDK
SDK | 下载地址 | SDK 说明文档 | 版本发布日志 |
JavaScript SDK |
引入 SDK
说明:
方法一:script 标签引入。
<script src="path/to/sdk" charset="utf-8"></script>
方法二:模块形式引入,默认 export module 为 UMD。
import TCGSDK, {CloudGamingWebSDK} from 'path-to-TCGSDK';// 直接使用 TCGSDK 或 new CloudGamingWebSDK()
启动 SDK
// 以下均为伪代码// 调用云 API 创建安卓实例访问Token// 加速腾讯云手机实例参考接口文档:https://cloud.tencent.com/document/api/1162/119708// 加速第三方云手机实例参考接口文档:https://cloud.tencent.com/document/product/1162/125484// 加速腾讯云手机实例可以参考 https://github.com/tencentyun/cloudgame-js-sdk/blob/master/samples/android_instance/src/android_instance/network.tsconst {AccessInfo, Token} = await CreateAndroidInstancesAccessToken({AndroidInstanceIds});TCGSDK.init({appid: 1234567,mount: 'mount-point', // 填入需要挂载入云手机视图的节点userId: 'userA', // 用户id,建议业务自定义,选填accessToken: {accessInfo: AccessInfo,token: Token},debugSetting: {showLog: true,},// 连接成功回调onConnectSuccess: (res) => {console.log('onConnectSuccess', res);},// 网络中断/被踢触发此回调onDisconnect: (res) => {console.log('onDisconnect', res);},// 初始化成功回调onInitSuccess: async (res) => {console.log('%c onInitSuccess', 'color: red', res);// 开始渲染TCGSDK.access({instanceId: AndroidInstanceIds[0]});}});
完整 Demo
Android 快速接入
获取 SDK
SDK | 下载地址 | SDK 说明文档 | 版本发布日志 |
Android SDK | 通过 Maven 集成 |
SDK 集成
在应用模块的 'build.gradle' 中引用:
implementation 'com.tencent.tcr:tcrsdk-full:3.26.1'
SDK 使用
// 请求云手机实例的访问信息AceessInfo和鉴权Tokenprivate void requestAccessToken() {AsyncCallback<ExpServerResponse<CreateAndroidInstancesAccessTokenResponse>> createAndroidInstancesAccessTokenCallback = new AsyncCallback<ExpServerResponse<CreateAndroidInstancesAccessTokenResponse>>() {@Overridepublic void onSuccess(ExpServerResponse<CreateAndroidInstancesAccessTokenResponse> expServerResponse) {if (expServerResponse.Error != null) {Log.e(TAG, "CreateAndroidInstancesAccessToken expServerResponse.Error: " + expServerResponse.Error);return;}if (expServerResponse.Response == null) {Log.e(TAG, "CreateAndroidInstancesAccessToken Response: null");return;}// 初始化 TcrSdkinitTcrSdk(expServerResponse);}@Overridepublic void onFailure(int code, String errorMsg) {Log.e(TAG, "CreateAndroidInstancesAccessToken failed: " + code + ", " + errorMsg);Toast.makeText(FunctionActivity.this, "获取实例访问信息失败: " + code + ", " + errorMsg, Toast.LENGTH_LONG).show();finish();}};......}// 初始化TcrSdkprivate void initTcrSdk(ExpServerResponse<CreateAndroidInstancesAccessTokenResponse> expServerResponse) {TcrSdk.TcrConfig config = new TcrSdk.TcrConfig();config.type = SdkType.CloudPhone;config.ctx = this;config.logger = new TcrLogger() {// 记录日志};config.callback = new AsyncCallback<Void>() {@Overridepublic void onSuccess(Void result) {Log.i(TAG, "init TcrSdk success");}@Overridepublic void onFailure(int code, String msg) {String errorMsg = "init TcrSdk failed:" + code + " msg:" + msg;Log.e(TAG, "init TcrSdk fail. errorMsg: " + errorMsg);}};config.accessInfo = expServerResponse.Response.AccessInfo;config.token = expServerResponse.Response.Token;TcrSdk.getInstance().init(config);}// 创建Tcr会话对象private void initTcrSession() {TcrSessionConfig tcrSessionConfig = TcrSessionConfig.builder().observer(mSessionObserver).build();mTcrSession = TcrSdk.getInstance().createTcrSession(tcrSessionConfig);if (mTcrSession == null) {Log.e(TAG, "mTcrSession = null");showToast("创建会话失败,请检查TcrSdk是否初始化成功", Toast.LENGTH_SHORT);}}// 创建渲染视图private void initTcrRenderView() {if (mTcrSession == null) {showToast("创建渲染视图必须有关联的会话", Toast.LENGTH_SHORT);return;}// 创建渲染视图mRenderView = TcrSdk.getInstance().createTcrRenderView(this, mTcrSession, TcrRenderViewType.SURFACE);if (mRenderView == null) {Log.e(TAG, "mRenderView = null");showToast("创建渲染失败,请检查TcrSdk是否初始化成功", Toast.LENGTH_SHORT);return;}// 将渲染视图添加到界面上((FrameLayout) findViewById(R.id.render_view_parent)).addView(mRenderView);}// Tcr会话的观察者,处理各类事件通知的消息和数据private final Observer mSessionObserver = new Observer() {@Overridepublic void onEvent(TcrSession.Event event, Object eventData) {switch (event) {case STATE_INITED:// 本地会话对象初始化完成// 可以开始连接指定的云手机。boolean ret = mTcrSession.access(mGroupInstanceIds, mIsGroup);if (!ret) {showToast("连接云手机失败,请重试", Toast.LENGTH_SHORT);finish();}break;case STATE_CONNECTED:// 成功和指定的云手机建立连接// 设置云手机的主控、同步列表、请求主控视频流if (mIsGroup) {String masterId = mGroupInstanceIds.get(0);TcrSdk.getInstance().getAndroidInstance().setMaster(masterId);TcrSdk.getInstance().getAndroidInstance().setSyncList(mGroupInstanceIds);TcrSdk.getInstance().getAndroidInstance().requestStream(masterId, "open", "low");}break;case STATE_RECONNECTING:showToast("重连中...", Toast.LENGTH_LONG);break;case STATE_CLOSED:showToast("会话关闭", Toast.LENGTH_SHORT);finish();break;default:break;}}};