云手机Android SDK
百度云手机Android-SDK接入说明
1.综述
云手机:用户在运营平台购买实例后,通过接入SDK,指定进入云手机模式。
2.1 接入准备
2.1.2环境要求
- minSdkVersion 21(android 5.0)及以上
- GLES 2.0及以上
- gradle版本6.1.1
- sdk只支持arm架构android环境(支持32及64位系统)
2.2 SDK集成
2.2.1 aar集成方法
将sdk(.aar文件)拷贝到项目libs(没有libs目录手动创建一个)目录下,并在项目模块的build.gradle中配置相应参数。
1android {
2 defaultConfig {
3 ndk {
4 abiFilters "arm64-v8a","armeabi-v7a"
5 }
6 }
7 repositories {
8 //libs 目录
9 flatDir {
10 dirs "libs"
11 }
12 }
13 dependencies {
14 implementation fileTree(include: ['*.aar'], dir: 'libs')
15 ...
16 }
17}
2.2.2 sdk所需权限
1<uses-permission android:name="android.permission.INTERNET" />
2<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
3<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
4<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
5<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
6<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
7<!------------------ 下面两项按需添加 -------------------------->
8<uses-permission android:name="android.permission.CAMERA" />
9<uses-permission android:name="android.permission.RECORD_AUDIO"/>
2.3 混淆规则
集成sdk后如需混淆,需要在相应的proguard-rules.pro文件中添加如下混淆规则
1-keep class com.mci.** { *; }
2-keep class com.baidu.armvm.mciwebrtc.** { *; }
2.4 布局组件
在布局文件中添加SdkView组件
1<com.baidu.armvm.api.SdkView
2 android:id="@+id/sdk_view"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:layout_centerInParent="true"
6 android:gravity="center"/>
2.5 Activity中接入SDK
2.5.1 接入流程图


2.5.2 预加载,初始化UI
接口:preLoad
示例代码:
1public class DemoApplication extends Application {
2 private static final String TAG = "DemoApplication";
3 public static boolean sdkPreLoadSuccess = false;
4
5 @Override
6 public void onCreate() {
7 super.onCreate();
8
9 // 1、initialization environment
10 HashMap<String, Object> params = new HashMap<>();
11 params.put("preLoadListener",
12 (PreLoadListener) (code, msg) -> {
13 Log.d(TAG, "preload so code:" + code + ", msg:" + msg);
14 if (code == 0) {
15 sdkPreLoadSuccess = true;
16 }
17 });
18 BgsSdk.preLoad(this, params);
19 }
20}
21
22public class VideoPlayActivity extends AppCompatActivity {
23 @Override
24 protected void onCreate(Bundle savedInstanceState) {
25 super.onCreate(savedInstanceState);
26
27 // 推荐设置Activity界面为全屏沉浸式效果
28 requestWindowFeature(Window.FEATURE_NO_TITLE);
29 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
30 WindowManager.LayoutParams.FLAG_FULLSCREEN);
31
32 if (!DemoApplication.sdkPreLoadSuccess) {
33 createErrorDialog(this, 100001, "PreLoadFail",
34 (dialog, which) -> VideoPlayActivity.this.finish());
35 return;
36 }
37
38 setContentView(R.layout.activity_video_play);
39
40 mSdkView = findViewById(R.id.sdk_view);
41 }
42}
2.5.3 创建sdk对象、初始化实例播放参数
接口:initPhone
示例代码:
1bgsSdk = new BgsSdk(VideoPlayActivity.this);
2
3HashMap<String, Object> params = new HashMap<>();
4params.put("sdkView", mSdkView);
5params.put("uuid", mUuid);
6params.put("width", 720);
7params.put("height", 1280);
8params.put("bitrate", 8192);
9params.put("fps", 30);
10params.put("sdkCallback", myPlaySdkCallback);
11// 用SDK采集视频
12params.put("useSdkCollectVideo", true);
13// 用SDK采集音频
14params.put("useSdkCollectAudio", true);
15
16bgsSdk.initPhone(params);
2.5.4 获取ServerToken
通过访问接口server-token去服务端获取serverToken。
2.5.5 连接实例
接口:startPhone
示例代码:
1if (bgsSdk != null) {
2 bgsSdk.startPhone(serverToken);
3}
2.5.6 断开实例
接口:stopPhone
示例代码:
1if (bgsSdk != null) {
2 bgsSdk.stopPhone();
3}
2.5.7 解绑实例
在SDK回调onStopped后,可视情况通过业务后台调用openApi接口disconnect去服务端解绑实例。
2.5.8 完整示例
1public class DemoApplication extends Application {
2 private static final String TAG = "DemoApplication";
3 public static boolean sdkPreLoadSuccess = false;
4
5 @Override
6 public void onCreate() {
7 super.onCreate();
8
9 // 1、initialization environment
10 HashMap<String, Object> params = new HashMap<>();
11 params.put("preLoadListener",
12 (PreLoadListener) (code, msg) -> {
13 Log.d(TAG, "preload so code:" + code + ", msg:" + msg);
14 if (code == 0) {
15 sdkPreLoadSuccess = true;
16 }
17 });
18 BgsSdk.preLoad(this, params);
19 }
20}
21
22public class VideoPlayActivity extends AppCompatActivity {
23 public static final int REQUEST_CAMERA_CODE = 5;
24 public static final int REQUEST_MIC_CODE = 6;
25 private static final String[] PERMISSION_CAMERA = new String[]{
26 Manifest.permission.CAMERA,
27 };
28 private static final String[] PERMISSION_MIC = new String[]{
29 Manifest.permission.RECORD_AUDIO,
30 };
31 // 需要启动的应用ID
32 private static final int APP_ID = 6;
33
34 private MyPlaySdkCallback myPlaySdkCallback;
35
36 private static final int INIT_PHONE = 1;
37 private static final int STOPED_PHONE = 2;
38
39 private BgsSdk bgsSdk;
40
41 private SdkView mSdkView; // video渲染用view
42 private View mBackView;
43
44 private String mUuid; // 用户唯一id,不能为空
45
46 private HandlerThread mHandlerThread;
47 private Handler mHandler;
48 private String serverToken;
49 private HandlerNetwork handlerNetwork;
50
51 /**
52 * 获取uuid,此方法在部分手机上(例如小米11 android 11)可能获取不到,
53 * 商用时获取uuid谨慎使用,此处仅用于演示
54 *
55 * @param application
56 * @return
57 */
58 public String getUUID(Application application) {
59 String uuid = null;
60 try {
61 uuid = Settings.System.getString(application.getContentResolver(),
62 Settings.Secure.ANDROID_ID);
63 } catch (Exception e) {
64 e.printStackTrace();
65 }
66
67 if (TextUtils.isEmpty(uuid)) {
68 uuid = "mciDemoDefaultUuid";
69 }
70 return uuid;
71 }
72
73 private void initPhone() {
74 myPlaySdkCallback = new MyPlaySdkCallback(VideoPlayActivity.this);
75
76 HashMap<String, Object> params = new HashMap<>();
77 params.put("sdkView", mSdkView);
78 params.put("uuid", mUuid);
79 params.put("width", 720);
80 params.put("height", 1280);
81 params.put("bitrate", 8192);
82 params.put("fps", 30);
83 params.put("sdkCallback", myPlaySdkCallback);
84 // 用SDK采集视频
85 params.put("useSdkCollectVideo", true);
86 // 用SDK采集音频
87 params.put("useSdkCollectAudio", true);
88 bgsSdk.initPhone(params);
89 }
90
91 private void getServerToken() {
92 if (bgsSdk == null) {
93 return;
94 }
95
96 try {
97 handlerNetwork.setCallBack(new HandlerNetwork.CallBack() {
98 @Override
99 public void onSuccess(String result) {
100 Gson gson = new Gson();
101 Response response = gson.fromJson(result, Response.class);
102
103 if (response == null || response.getData() == null
104 || response.getData().getSuccessList() == null
105 || response.getData().getSuccessList().size() < 1
106 || response.getData().getSuccessList().get(0) == null
107 || TextUtils.isEmpty(response.getData()
108 .getSuccessList().get(0).getServerToken())) {
109 onDisconnected(222001, "获取serverToken失败");
110 return;
111 }
112 serverToken = response.getData()
113 .getSuccessList().get(0).getServerToken();
114
115 if (bgsSdk != null) {
116 bgsSdk.startPhone(serverToken);
117 }
118 }
119
120 @Override
121 public void onFail(String error) {
122 onDisconnected(222001, "获取serverToken失败");
123 }
124 });
125
126 String[] instanceCodes = new String[] {"VM010151051179"}; //实列列表
127 String onlineTime = String.valueOf(60 * 60 * 24 *30); // 在线时长1个月
128 handlerNetwork.getServerToken(mUuid, instanceCodes,
129 onlineTime);
130 } catch (Exception e) {
131 e.printStackTrace();
132 }
133 }
134
135 private void stopPhone() {
136 if (mHandler != null) {
137 mHandler.removeCallbacksAndMessages(null);
138 mHandler = null;
139 }
140
141 if (mHandlerThread != null) {
142 mHandlerThread.quitSafely();
143 mHandlerThread = null;
144 }
145 }
146
147 @Override
148 protected void onCreate(Bundle savedInstanceState) {
149 super.onCreate(savedInstanceState);
150 // set full screen
151 requestWindowFeature(Window.FEATURE_NO_TITLE);
152 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
153 WindowManager.LayoutParams.FLAG_FULLSCREEN);
154
155 if (!DemoApplication.sdkPreLoadSuccess) {
156 createErrorDialog(this, 100001, "PreLoadFail",
157 (dialog, which) -> VideoPlayActivity.this.finish());
158 return;
159 }
160
161 setContentView(R.layout.activity_video_play);
162 mSdkView = findViewById(R.id.sdk_view);
163 mBackView = findViewById(R.id.menu_view);
164 bgsSdk = new BgsSdk(VideoPlayActivity.this);
165 mUuid = getUUID(getApplication());
166 handlerNetwork = new HandlerNetwork();
167
168 mHandlerThread = new HandlerThread("NetworkRequestThread");
169 mHandlerThread.start();
170 mHandler = new Handler(mHandlerThread.getLooper()) {
171 @Override
172 public void handleMessage(@NonNull Message msg) {
173 super.handleMessage(msg);
174 switch (msg.what) {
175 case INIT_PHONE:
176 initPhone();
177 break;
178 case STOPED_PHONE:
179 stopPhone();
180 break;
181 default:
182 break;
183 }
184 }
185 };
186 mHandler.sendEmptyMessage(INIT_PHONE);
187 }
188
189 @Override
190 protected void onResume() {
191 super.onResume();
192 // resume game
193 if (bgsSdk != null) {
194 bgsSdk.resume();
195 }
196 }
197
198 @Override
199 protected void onStop() {
200 super.onStop();
201 // pause game, 应用彻底不可见时暂停云端推流
202 if (bgsSdk != null) {
203 bgsSdk.pause();
204 }
205 }
206
207 @Override
208 public void onBackPressed() {
209 if (mBackView != null) {
210 mBackView.setVisibility(View.VISIBLE);
211 }
212 }
213
214 @Override
215 protected void onDestroy() {
216 super.onDestroy();
217 // stop game and release resources
218 if (bgsSdk != null) {
219 // stop game
220 bgsSdk.stopPhone();
221 }
222
223 myPlaySdkCallback = null;
224 }
225
226 public void onDisconnected(int errorCode, String msg) {
227 createErrorDialog(VideoPlayActivity.this, errorCode, msg,
228 (dialog, which) -> VideoPlayActivity.this.finish());
229 }
230
231 public void onInitSuccess() {
232 getServerToken();
233 }
234
235 public void onInitFail(int code, String msg) {
236 createErrorDialog(VideoPlayActivity.this, code, msg,
237 (dialog, which) -> VideoPlayActivity.this.finish());
238 }
239
240 public void onConnectSuccess() {
241 }
242
243 public void onStopped() {
244 if (mHandler != null) {
245 mHandler.sendEmptyMessage(STOPED_PHONE);
246 }
247 }
248
249 public void onClick(View view) {
250 int keyCode = -1;
251 switch (view.getId()) {
252 case R.id.menu_btn:
253 keyCode = MCIKeyEvent.KEYCOED_MENU;
254 break;
255 case R.id.home_btn:
256 keyCode = MCIKeyEvent.KEYCOED_HOME;
257 break;
258 case R.id.back_btn:
259 keyCode = MCIKeyEvent.KEYCOED_BACK;
260 break;
261 case R.id.quit_btn:
262 // 退出
263 finish();
264 break;
265 default:
266 break;
267 }
268
269 if (keyCode > 0 && bgsSdk != null) {
270 bgsSdk.sendKeyEvent(MCIKeyEvent.ACTION_UNDEFINED, keyCode);
271 }
272
273 if (mBackView != null) {
274 mBackView.setVisibility(View.GONE);
275 }
276 }
277
278 private void createErrorDialog(Context context, int errCode, String errMsg,
279 DialogInterface.OnClickListener onClickListener) {
280 runOnUiThread(new Runnable() {
281 @Override
282 public void run() {
283 AlertDialog.Builder b = new AlertDialog.Builder(context);
284 b.setTitle("返回错误提示");
285 b.setMessage("CallBack返回了" + errCode + " ; errMsg : " + errMsg);
286 b.setNegativeButton("确定", onClickListener);
287 b.setPositiveButton("取消", onClickListener);
288 AlertDialog dialog = b.create();
289 dialog.setCanceledOnTouchOutside(false);
290 dialog.show();
291
292 }
293 });
294 }
295
296 @Override
297 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
298 @NonNull int[] grantResults) {
299 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
300 if (requestCode == REQUEST_CAMERA_CODE) {
301 if (bgsSdk != null) {
302 bgsSdk.openCamera();
303 }
304 } else if (requestCode == REQUEST_MIC_CODE) {
305 if (bgsSdk != null) {
306 bgsSdk.openMic();
307 }
308 }
309 }
310
311 public void onRequestPermission(String s) {
312 if (Manifest.permission.RECORD_AUDIO.equals(s)) {
313 checkPermission(VideoPlayActivity.this, PERMISSION_MIC, REQUEST_MIC_CODE);
314 }
315 if (Manifest.permission.CAMERA.equals(s)) {
316 checkPermission(VideoPlayActivity.this, PERMISSION_CAMERA, REQUEST_CAMERA_CODE);
317 }
318 }
319
320 public static boolean checkPermission(Activity activity, String[] permission, int requestCode) {
321 if (isPermissionGranted(activity, permission)) {
322 return true;
323 } else {
324 // 如果没有设置过权限许可,则弹出系统的授权窗口
325 ActivityCompat.requestPermissions(activity, permission, requestCode);
326 return false;
327 }
328 }
329
330 // 每个权限是否已授权
331 public static boolean isPermissionGranted(Activity activity, String[] permission) {
332 if (Build.VERSION.SDK_INT >= 23) {
333 for (int i = 0; i < permission.length; i++) {
334 int checkPermission = ContextCompat.checkSelfPermission(activity, permission[i]);
335 /***
336 * checkPermission返回两个值
337 * 有权限: PackageManager.PERMISSION_GRANTED
338 * 无权限: PackageManager.PERMISSION_DENIED
339 */
340 if (checkPermission != PackageManager.PERMISSION_GRANTED) {
341 return false;
342 }
343 }
344 }
345 return true;
346 }
347}
348
349public class MyPlaySdkCallback extends BgsSdkCallback {
350 private static final String TAG = "MyPlaySdkCallback";
351 private VideoPlayActivity videoPlayActivity;
352
353 public MyPlaySdkCallback(VideoPlayActivity videoPlayActivity) {
354 this.videoPlayActivity = videoPlayActivity;
355 }
356 @Override
357 public void onInitSuccess() {
358 if (videoPlayActivity != null) {
359 videoPlayActivity.onInitSuccess();
360 }
361 }
362
363 @Override
364 public void onInitFail(int i, String s) {
365 if (videoPlayActivity != null) {
366 videoPlayActivity.onInitFail(i, s);
367 }
368 }
369
370 @Override
371 public void onConnectSuccess() {
372 if (videoPlayActivity != null) {
373 videoPlayActivity.onConnectSuccess();
374 }
375 }
376
377 @Override
378 public void onConnectFail(int i, String s) {
379 if (videoPlayActivity != null) {
380 videoPlayActivity.onDisconnected(i, s);
381 }
382 }
383
384 @Override
385 public void onStopped() {
386 if (videoPlayActivity != null) {
387 videoPlayActivity.onStopped();
388 }
389 }
390
391 @Override
392 public void onDisconnected(int i) {
393 Log.d(TAG, "onDisconnected i = " + i);
394 if (videoPlayActivity != null) {
395 videoPlayActivity.onDisconnected(i, "onDisconnected");
396 }
397 }
398
399 @Override
400 public void onPlayInfo(String s) {
401 Log.d(TAG, "onPlayInfo s = " + s);
402 }
403
404 @Override
405 public void onRenderedFirstFrame(int i, int i1) {
406 Log.d(TAG, "onRenderedFirstFrame i = " + i + ", i1 = " + i1);
407 }
408
409 @Override
410 public void onVideoSizeChanged(int i, int i1) {
411 Log.d(TAG, "onVideoSizeChanged i = " + i + ", i1 = " + i1);
412 }
413
414 @Override
415 public void onRequestPermission(String s) {
416 if (videoPlayActivity != null) {
417 videoPlayActivity.onRequestPermission(s);
418 }
419 }
420}
函数说明:
3 SDK高级功能
3.1 切换分辨率,比特率,帧率
4 SDK开发指南
sdk的api函数都封装到了com.mci.commonplaysdk.BgsSdk.java类中,具体函数描述如下
4.1 构造函数
- 函数原型:
1public BgsSdk(Activity activity)
- 函数说明:BgsSdk构造函数。
4.2 类函数
4.2.1 preLoad
- 函数原型:
1public static void preLoad(Application application, HashMap<String, Object> params)
- 函数说明:预加载SO,初始化SDK运行时环境。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
application | Application | 非空Application对象 |
params | HashMap<String, Object> | 加载SO的参数,见下表 |
- params参数说明:
关键字 | 值的类型 | 必填项 | 说明 |
---|---|---|---|
preLoadListener | PreLoadListener | 非必填 | 默认值为null。(SO加载回调,详见PreLoadListener) |
cloudLoadSo | boolean | 非必填 | 默认值为false。(true:加载网络SO, false:加载本地SO) |
soFile | String | 非必填 | 默认值为null。(SDK 中加载so库文件地址,不设置使用SDK中默认so库) |
logLevel | int | 非必填 | BsgSdk.LOG_DEFAULT。(日志级别,具体定义参考log等级) |
writeLogToFile | boolean | 非必填 | 默认值为true。(标记是否把SDK中日志保存到设备本地,true :保存;false:不保存) |
- 返回结果:
通过PreLoadListener接口中的void onLoad(int code, String msg)回调SO加载结果。
code:0,表示加载成功。
code:非0,表示加载失败,msg变量中给出相应的异常信息。
4.3 成员函数
initPhone
特别说明:初始化操作要确保在SO加载成功后再进行。
- 函数原型:
1public int initPhone(HashMap<String, Object> params)
- 函数说明:用户信息参数、云手机定制参数。
- params参数说明:
关键字 | 值的类型 | 必填项 | 说明 |
---|---|---|---|
sdkView | SdkView | 必填 | SdkView对象,云手机显示的画布,需要布局到您的应用 |
uuid | String | 必填 | 设置用户uuid,uuid是用来区分真实用户的唯一标识,由应用测来定义,请根据业务场景来决定 |
width | int | 必填 | 推流视频分辨率宽,如:720(推流请求是视频是竖屏width < height) |
height | int | 必填 | 推流视频分辨率高,如:1280 |
bitrate | int | 必填 | 推流视频码率,单位kBps,如:4092 |
fps | int | 必填 | 推流视频帧率,如:30 |
instanceCode | string | 非必填 | 设备编号 |
sdkCallback | BgsSdkCallback | 非必填 | 默认值为null。(SDK回调接口,详见BgsSdkCallback) |
useSWDecode | boolean | 非必填 | 默认值为false。(Video解码方式,true:软解;false:硬解) |
noVideoDataTimeout | int | 非必填 | 默认值为30。(单位s,设置首次启动视频推流超时时间,若超过设定超时时间还没有视频流返回,会报10006错误码,并断开与云端连接。) |
gameScreenRotate | boolean | 非必填 | 默认值为false。(控制Sdk是否允许画面依据手机重力方向做180度旋转。true,开启此功能;false,关闭此动能) |
autoSwitchDecodeMode | boolean | 非必填 | 默认值为false。(控制Sdk硬解异常后自动切换到软解。 false:不切换; true:切换) |
forcePortrait | boolean | 非必填 | 默认值为false。(设置强制横屏显示,设置后,竖屏应用会被强制横屏显示。针对电视、盒子等大屏设备,普通手机无需设置。) |
defaultRotation | boolean | 非必填 | 默认值为false。(设置应用默认屏幕方向,false:竖屏, true:横屏) |
useSdkCollectVideo | boolean | 非必填 | 默认值为false。(true,由sdk采集摄像头数据; false, 由客户端自己处理) |
useSdkCollectAudio | boolean | 非必填 | 默认值为false。(true,由sdk采集麦克风数据, false, 由客户端自己处理) |
logSource | String | 非必填 | 默认值为null。(日志来源,通常传appkey,同时用于控制是否上报sdk日志,默认不上报) |
foregroundTimeOut | int | 非必填 | 默认值为0。(前台超时时间,单位s) |
backgroundTimeOut | int | 非必填 | 默认值为0。(后台超时时间,单位s) |
autoControlQuality | boolean | 非必填 | 默认值为false。(控制Sdk是否允许依据网络情况自动切换码率及帧率,true,开启此功能;false,关闭此动能),功能开启后需要同时设置videoLevels才会生效,详见自动调整画质等级) |
videoLevels | VideoParam[] | 非必填 | 默认值null,(画质等级数组,只有autoControlQuality设置为true才会生效,开启后sdk会依据网络情况及传入的画质等级参数自动适配一组参数请求推流,详见自动调整画质等级) |
h265StreamMode | int | 非必填 | 默认值为1。(H265的设置方式:1-自动、2-手动、3-白名单模式)2.6.0以上的版本才支持 |
forceEncodeType | int | 非必填 | 默认值为-1。在h265StreamMode等于2的情况下有效。(手动设置的推流模式:2-H264、10-H265)2.6.0以上的版本才支持 |
- 返回结果:
通过BgsSdkCallback类中的void onInitSuccess()回调初始化成功。
通过BgsSdkCallback类中的void onInitFail(int code, String msg)回调初始化失败信息。
code:初始化失败错误码,msg变量中给出相应的初始化异常信息。
- 失败错误码
错误码 | 错误描述 |
---|---|
330102 | 初始化时uuid为空 |
330103 | 初始化时sdkView为空 |
330106 | 初始化时width为空 |
330107 | 初始化时height为空 |
330108 | 初始化时bitrate为空 |
330109 | 初始化时fps为空 |
云手机播放
特别说明:播放操作要确保在initGame成功后再进行。
startPhone
特别说明:播放操作要确保在initGame成功后再进行。
- 函数原型:
1public void startPhone(String serverToken)
- 函数说明:连接并播放云手机。
- 返回结果:
通过BgsSdkCallback类中的void onConnectSuccess()回调设备连接成功。
通过BgsSdkCallback类中的void onConnectFail(int code, String msg)回调连接和播放失败信息。
code:连接和播放失败错误码,msg变量中给出相应的连接和播放异常信息。
- 失败错误码
错误码 | 错误描述 |
---|---|
330101 | serverToken为空 |
330201 | 连接设备失败 |
330202 | 调用startPhone接口时,initGame接口还没有回调onInitSuccess |
330204 | 连接设备失败,服务端不可用,http status != 200的情况 |
330205 | 连接设备失败,服务端可用,http status == 200的情况,申请失败 |
pause
- 函数原型:
1public void pause()
- 函数说明:暂停连接云手机,只有在调用startPhone后才生效,与resume对应。
resume
- 函数原型:
1public void resume()
- 函数说明:恢复连接云手机,只有在调用startPhone后才生效,与pause对应。
stopPhone
- 函数原型:
1public void stopPhone()
- 函数说明:释放云手机。
画质
setStreamConfig
- 函数原型:
1public void setStreamConfig(int width, int height, int bitrate, int fps)
- 函数说明:设置视频宽高,帧率,码率,须在第一帧画面返回后设置才能生效。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
width | int | 压码视屏宽 |
height | int | 压码视频高 |
bitrate | int | 视频码率,单位kBps |
fps | int | 视频帧率 |
数据透传到云手机
sendKeyEvent
- 函数原型:
1public void sendKeyEvent(int action, int keyCode)
- 函数说明:透传键值事件到云手机。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
action | int | 事件行为,按下或抬起,对应 KeyEvent.ACTION_DOWN和KeyEvent.ACTION_UP |
keyCode | int | 具体按键值,传linux键值,对应KeyEvent.getScanCode() |
sendSensorData
- 函数原型:
1public int sendSensorData(int type, float[] data)
- 函数说明:透传传感器数据到云手机。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
type | int | 传感器类型,详见传感器类型 |
data | float[] | 传感器数据 |
- 返回结果:0成功,其他失败。
sendLocationData
- 函数原型:
1public int sendLocationData(float longitude,
2 float latitude,
3 float altitude,
4 float floor,
5 float horizontalAccuracy,
6 float verticalAccuracy,
7 float speed,
8 float direction,
9 String timestamp)
- 函数说明:发送位置数据到云手机。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
longitude | float | 纬度(度) |
latitude | float | 经度(度) |
altitude | float | 高度(米) |
floor | float | 楼层 |
horizontalAccuracy | float | 水平精度(米) |
verticalAccuracy | float | 垂直精度(米) |
speed | float | 速度(米/秒) |
direction | float | 方向 |
timestamp | String | 时间戳 |
- 返回结果:0成功,其他失败。
sendTransparentMsgReq
- 函数原型:
1public int sendTransparentMsgReq(int type, String data, String binderService)
- 函数说明:透传信息到云手机。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
type | int | 自定义类型 |
data | String | 具体数据 |
binderService | String | 云端binder service名称 |
- 返回结果:0成功,其他失败。
sendJoystickInput
- 函数原型:
1public int sendJoystickInput(int index, int pressed, int buttons,
2 int lx, int ly, int rx, int ry)
- 函数说明:透传手柄键值到云手机。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
index | int | 手柄编号,从0开始递增 |
pressed | int | 按键事件,抬起按下行为, 参见自定义手柄键值中ACTION_DOWN及ACTION_UP |
buttons | int | 按键值,参见自定义手柄键值 |
lx | int | 左摇杆x坐标 |
ly | int | 左摇杆y坐标 |
rx | int | 右摇杆x坐标 |
ry | int | 右摇杆y坐标 |
- 返回结果:0成功,其他失败。
setExtraData
- 函数原型:
1public void setExtraData(int type, String info)
- 函数说明:透传账号信息到云手机。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
type | int | 账号信息自定义类型 |
info | String | 账号数据 |
sendAVData
- 函数原型:
1public int sendAVData(int avType, int frameType, byte[] data)
- 函数说明:发送音视频数据到云手机,目前只支持H264及aac。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
avType | int | 用于区分音频(211)及视频(212), 具体值参考传感器类型 |
frameType | int | 音视频不同的编码类型,详情参考音视频编码帧类型 |
data | byte[] | 具体音视频编码帧数据 |
- 返回结果:0成功,其他失败。
copyToRemote
- 函数原型:
1public void copyToRemote(byte[] value)
- 函数说明:透传剪切板数据到云手机的剪切板中,间接实现客户端到云手机的粘贴。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
value | byte[] | 剪切板的字符串数据要转为byte[] |
sendInputString
- 函数原型:
1public void sendInputString(byte[] value)
- 函数说明:透传字符串数据到云手机。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
value | byte[] | 字符串数据要转为byte[] |
获取设备编号
getPadCode
- 函数原型:
1public String getPadCode()
- 函数说明:获取设备编号,调用startGame后可获取。
- 返回结果:返回设备编号。
音视频采集
setUseSdkCollectVideo
- 函数原型 :
1public void setUseSdkCollectVideo(boolean isSdkCollectVideo)
- 函数说明:控制是否由SDK采集摄像头数据并上传。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
isSdkCollectVideo | boolean | true,由sdk采集摄像头数据; false, 由客户端自己处理 |
setAVEncodeParams
- 函数原型 :
1public void setAVEncodeParams(AVEncodeParamsBean paramsBean)
- 函数说明:设置sdk采集摄像头数据压码参数。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
paramsBean | AVEncodeParamsBean | 摄像头采集参数 |
openCamera
- 函数原型 :
1public void openCamera()
- 函数说明:打开摄像头并采集数据上传到云端,通常不需要主动调用此函数,只有当用户未授权摄像头权限,sdk回调通知用户去授权且等用户授权后才需要调用,权限请求接口回调详见BgsSdkCallback中onRequestPermission
setUseSdkCollectAudio
- 函数原型 :
1public void setUseSdkCollectAudio(boolean isSdkCollectAudio)
- 函数说明:控制是否由SDK采集麦克风数据并上传。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
isSdkCollectAudio | boolean | true,由sdk采集麦克风数据, false, 由客户端自己处理 |
openMic
- 函数原型 :
1public void openMic()
- 函数说明:打开麦克风并采集数据上传到云端,通常不需要主动调用此函数,只有当用户未授权麦克风权限,sdk回调通知用户去授权且等用户授权后才需要调用,权限请求接口回调详见BgsSdkCallback中onRequestPermission
其他
getVersion
- 函数原型:
1public String getVersion()
- 函数说明:获取sdk版本号。
- 返回结果:返回sdk版本号。
audioPauseOrResume
- 函数原型 :
1public void audioPauseOrResume(boolean isResume)
- 函数说明:控制sdk是否静音及恢复播放声音。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
isResume | boolean | true,恢复播放声音;false,设置静音 |
sendKeyboardType
- 函数原型 :设置云手机的键盘类型
1public void sendKeyboardType(int type)
参数 | 类型 | 说明 |
---|---|---|
type | int | 0 是硬键盘 1 是软键盘 |
setNavBarVisible
- 函数原型 :设置云手机的导航键状态
1public void setNavBarVisible(boolean show)
参数 | 类型 | 说明 |
---|---|---|
show | boolean | true: 导航键显示 false:导航键隐藏 |
getProtocolType
- 函数原型 :获取当前的推流协议。
- 返回结果 :返回当前的推流协议。
1public String getProtocolType()