一、接入流程
如上图所示,云手机 SDK 的使用流程如下:
·加速腾讯云手机实例使用 CreateAndroidInstancesAccessToken 获取
·加速第三方云手机实例使用 CreateAndroidInstanceAcceleratorToken 获取
注意:说明:
注意:若接入的是第三方云手机实例,需要在第三方云手机实例上部署腾讯音视频服务。若你有相关接入需求,请联系你的腾讯云商务或 填写表单。
2. 将获取的访问 Token 及 AccessInfo 下发给业务客户端,并调用 SDK 接口 setAccessToken 添加到云手机 SDK。
3. 业务客户端调用云手机 SDK 的接口实现连接云手机实例,具体接口及功能请参考 云手机 SDK 文档。
二、获取 SDK
| SDK | 下载地址 | SDK 说明文档 | 版本发布日志 |
| JavaScript SDK | GitHub下载 | 接口说明 | Release Notes |
三、引入 SDK
注意:说明:
注意:TCGSDK export UMD module 已默认将 TCGSDK 挂载到 Window 下,可直接使用 TCGSDK 对象,也可以自行初始化实例。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 Instance React Demo。
六、获取 SDK
| SDK | 下载地址 | SDK 说明文档 | 版本发布日志 |
| Android SDK | 通过 Maven 集成 | 接口说明 | Release notes |
七、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>>() { @Override public 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; } // 初始化 TcrSdk initTcrSdk(expServerResponse); } @Override public 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>() { @Override public void onSuccess(Void result) { Log.i(TAG, "init TcrSdk success"); } @Override public 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() { @Override public 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; } }};
九、完整 Demo
完整接入代码可参考 TcrCloudPhoneDemo。