云手机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中配置相应参数。
android {
defaultConfig {
ndk {
abiFilters "arm64-v8a","armeabi-v7a"
}
}
repositories {
//libs 目录
flatDir {
dirs "libs"
}
}
dependencies {
implementation fileTree(include: ['*.aar'], dir: 'libs')
...
}
}
2.2.2 sdk所需权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!------------------ 下面两项按需添加 -------------------------->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
2.3 混淆规则
集成sdk后如需混淆,需要在相应的proguard-rules.pro文件中添加如下混淆规则
-keep class com.mci.** { *; }
-keep class com.baidu.armvm.mciwebrtc.** { *; }
2.4 布局组件
在布局文件中添加SdkView组件
<com.baidu.armvm.api.SdkView
android:id="@+id/sdk_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:gravity="center"/>
2.5 Activity中接入SDK
2.5.1 接入流程图
2.5.2 预加载,初始化UI
接口:preLoad
示例代码:
public class DemoApplication extends Application {
private static final String TAG = "DemoApplication";
public static boolean sdkPreLoadSuccess = false;
@Override
public void onCreate() {
super.onCreate();
// 1、initialization environment
HashMap<String, Object> params = new HashMap<>();
params.put("preLoadListener",
(PreLoadListener) (code, msg) -> {
Log.d(TAG, "preload so code:" + code + ", msg:" + msg);
if (code == 0) {
sdkPreLoadSuccess = true;
}
});
BgsSdk.preLoad(this, params);
}
}
public class VideoPlayActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 推荐设置Activity界面为全屏沉浸式效果
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
if (!DemoApplication.sdkPreLoadSuccess) {
createErrorDialog(this, 100001, "PreLoadFail",
(dialog, which) -> VideoPlayActivity.this.finish());
return;
}
setContentView(R.layout.activity_video_play);
mSdkView = findViewById(R.id.sdk_view);
}
}
2.5.3 创建sdk对象、初始化实例播放参数
接口:initPhone
示例代码:
bgsSdk = new BgsSdk(VideoPlayActivity.this);
HashMap<String, Object> params = new HashMap<>();
params.put("sdkView", mSdkView);
params.put("uuid", mUuid);
params.put("width", 720);
params.put("height", 1280);
params.put("bitrate", 8192);
params.put("fps", 30);
params.put("sdkCallback", myPlaySdkCallback);
// 用SDK采集视频
params.put("useSdkCollectVideo", true);
// 用SDK采集音频
params.put("useSdkCollectAudio", true);
bgsSdk.initPhone(params);
2.5.4 获取ServerToken
通过访问接口server-token去服务端获取serverToken。
2.5.5 连接实例
接口:startPhone
示例代码:
if (bgsSdk != null) {
bgsSdk.startPhone(serverToken);
}
2.5.6 断开实例
接口:stopPhone
示例代码:
if (bgsSdk != null) {
bgsSdk.stopPhone();
}
2.5.7 解绑实例
在SDK回调onStopped后,可视情况通过业务后台调用openApi接口disconnect去服务端解绑实例。
2.5.8 完整示例
public class DemoApplication extends Application {
private static final String TAG = "DemoApplication";
public static boolean sdkPreLoadSuccess = false;
@Override
public void onCreate() {
super.onCreate();
// 1、initialization environment
HashMap<String, Object> params = new HashMap<>();
params.put("preLoadListener",
(PreLoadListener) (code, msg) -> {
Log.d(TAG, "preload so code:" + code + ", msg:" + msg);
if (code == 0) {
sdkPreLoadSuccess = true;
}
});
BgsSdk.preLoad(this, params);
}
}
public class VideoPlayActivity extends AppCompatActivity {
public static final int REQUEST_CAMERA_CODE = 5;
public static final int REQUEST_MIC_CODE = 6;
private static final String[] PERMISSION_CAMERA = new String[]{
Manifest.permission.CAMERA,
};
private static final String[] PERMISSION_MIC = new String[]{
Manifest.permission.RECORD_AUDIO,
};
// 需要启动的应用ID
private static final int APP_ID = 6;
private MyPlaySdkCallback myPlaySdkCallback;
private static final int INIT_PHONE = 1;
private static final int STOPED_PHONE = 2;
private BgsSdk bgsSdk;
private SdkView mSdkView; // video渲染用view
private View mBackView;
private String mUuid; // 用户唯一id,不能为空
private HandlerThread mHandlerThread;
private Handler mHandler;
private String serverToken;
private HandlerNetwork handlerNetwork;
/**
* 获取uuid,此方法在部分手机上(例如小米11 android 11)可能获取不到,
* 商用时获取uuid谨慎使用,此处仅用于演示
*
* @param application
* @return
*/
public String getUUID(Application application) {
String uuid = null;
try {
uuid = Settings.System.getString(application.getContentResolver(),
Settings.Secure.ANDROID_ID);
} catch (Exception e) {
e.printStackTrace();
}
if (TextUtils.isEmpty(uuid)) {
uuid = "mciDemoDefaultUuid";
}
return uuid;
}
private void initPhone() {
myPlaySdkCallback = new MyPlaySdkCallback(VideoPlayActivity.this);
HashMap<String, Object> params = new HashMap<>();
params.put("sdkView", mSdkView);
params.put("uuid", mUuid);
params.put("width", 720);
params.put("height", 1280);
params.put("bitrate", 8192);
params.put("fps", 30);
params.put("sdkCallback", myPlaySdkCallback);
// 用SDK采集视频
params.put("useSdkCollectVideo", true);
// 用SDK采集音频
params.put("useSdkCollectAudio", true);
bgsSdk.initPhone(params);
}
private void getServerToken() {
if (bgsSdk == null) {
return;
}
try {
handlerNetwork.setCallBack(new HandlerNetwork.CallBack() {
@Override
public void onSuccess(String result) {
Gson gson = new Gson();
Response response = gson.fromJson(result, Response.class);
if (response == null || response.getData() == null
|| response.getData().getSuccessList() == null
|| response.getData().getSuccessList().size() < 1
|| response.getData().getSuccessList().get(0) == null
|| TextUtils.isEmpty(response.getData()
.getSuccessList().get(0).getServerToken())) {
onDisconnected(222001, "获取serverToken失败");
return;
}
serverToken = response.getData()
.getSuccessList().get(0).getServerToken();
if (bgsSdk != null) {
bgsSdk.startPhone(serverToken);
}
}
@Override
public void onFail(String error) {
onDisconnected(222001, "获取serverToken失败");
}
});
String[] instanceCodes = new String[] {"VM010151051179"}; //实列列表
String onlineTime = String.valueOf(60 * 60 * 24 *30); // 在线时长1个月
handlerNetwork.getServerToken(mUuid, instanceCodes,
onlineTime);
} catch (Exception e) {
e.printStackTrace();
}
}
private void stopPhone() {
if (mHandler != null) {
mHandler.removeCallbacksAndMessages(null);
mHandler = null;
}
if (mHandlerThread != null) {
mHandlerThread.quitSafely();
mHandlerThread = null;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// set full screen
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
if (!DemoApplication.sdkPreLoadSuccess) {
createErrorDialog(this, 100001, "PreLoadFail",
(dialog, which) -> VideoPlayActivity.this.finish());
return;
}
setContentView(R.layout.activity_video_play);
mSdkView = findViewById(R.id.sdk_view);
mBackView = findViewById(R.id.menu_view);
bgsSdk = new BgsSdk(VideoPlayActivity.this);
mUuid = getUUID(getApplication());
handlerNetwork = new HandlerNetwork();
mHandlerThread = new HandlerThread("NetworkRequestThread");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case INIT_PHONE:
initPhone();
break;
case STOPED_PHONE:
stopPhone();
break;
default:
break;
}
}
};
mHandler.sendEmptyMessage(INIT_PHONE);
}
@Override
protected void onResume() {
super.onResume();
// resume game
if (bgsSdk != null) {
bgsSdk.resume();
}
}
@Override
protected void onStop() {
super.onStop();
// pause game, 应用彻底不可见时暂停云端推流
if (bgsSdk != null) {
bgsSdk.pause();
}
}
@Override
public void onBackPressed() {
if (mBackView != null) {
mBackView.setVisibility(View.VISIBLE);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// stop game and release resources
if (bgsSdk != null) {
// stop game
bgsSdk.stopPhone();
}
myPlaySdkCallback = null;
}
public void onDisconnected(int errorCode, String msg) {
createErrorDialog(VideoPlayActivity.this, errorCode, msg,
(dialog, which) -> VideoPlayActivity.this.finish());
}
public void onInitSuccess() {
getServerToken();
}
public void onInitFail(int code, String msg) {
createErrorDialog(VideoPlayActivity.this, code, msg,
(dialog, which) -> VideoPlayActivity.this.finish());
}
public void onConnectSuccess() {
}
public void onStopped() {
if (mHandler != null) {
mHandler.sendEmptyMessage(STOPED_PHONE);
}
}
public void onClick(View view) {
int keyCode = -1;
switch (view.getId()) {
case R.id.menu_btn:
keyCode = MCIKeyEvent.KEYCOED_MENU;
break;
case R.id.home_btn:
keyCode = MCIKeyEvent.KEYCOED_HOME;
break;
case R.id.back_btn:
keyCode = MCIKeyEvent.KEYCOED_BACK;
break;
case R.id.quit_btn:
// 退出
finish();
break;
default:
break;
}
if (keyCode > 0 && bgsSdk != null) {
bgsSdk.sendKeyEvent(MCIKeyEvent.ACTION_UNDEFINED, keyCode);
}
if (mBackView != null) {
mBackView.setVisibility(View.GONE);
}
}
private void createErrorDialog(Context context, int errCode, String errMsg,
DialogInterface.OnClickListener onClickListener) {
runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder b = new AlertDialog.Builder(context);
b.setTitle("返回错误提示");
b.setMessage("CallBack返回了" + errCode + " ; errMsg : " + errMsg);
b.setNegativeButton("确定", onClickListener);
b.setPositiveButton("取消", onClickListener);
AlertDialog dialog = b.create();
dialog.setCanceledOnTouchOutside(false);
dialog.show();
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CAMERA_CODE) {
if (bgsSdk != null) {
bgsSdk.openCamera();
}
} else if (requestCode == REQUEST_MIC_CODE) {
if (bgsSdk != null) {
bgsSdk.openMic();
}
}
}
public void onRequestPermission(String s) {
if (Manifest.permission.RECORD_AUDIO.equals(s)) {
checkPermission(VideoPlayActivity.this, PERMISSION_MIC, REQUEST_MIC_CODE);
}
if (Manifest.permission.CAMERA.equals(s)) {
checkPermission(VideoPlayActivity.this, PERMISSION_CAMERA, REQUEST_CAMERA_CODE);
}
}
public static boolean checkPermission(Activity activity, String[] permission, int requestCode) {
if (isPermissionGranted(activity, permission)) {
return true;
} else {
// 如果没有设置过权限许可,则弹出系统的授权窗口
ActivityCompat.requestPermissions(activity, permission, requestCode);
return false;
}
}
// 每个权限是否已授权
public static boolean isPermissionGranted(Activity activity, String[] permission) {
if (Build.VERSION.SDK_INT >= 23) {
for (int i = 0; i < permission.length; i++) {
int checkPermission = ContextCompat.checkSelfPermission(activity, permission[i]);
/***
* checkPermission返回两个值
* 有权限: PackageManager.PERMISSION_GRANTED
* 无权限: PackageManager.PERMISSION_DENIED
*/
if (checkPermission != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}
}
public class MyPlaySdkCallback extends BgsSdkCallback {
private static final String TAG = "MyPlaySdkCallback";
private VideoPlayActivity videoPlayActivity;
public MyPlaySdkCallback(VideoPlayActivity videoPlayActivity) {
this.videoPlayActivity = videoPlayActivity;
}
@Override
public void onInitSuccess() {
if (videoPlayActivity != null) {
videoPlayActivity.onInitSuccess();
}
}
@Override
public void onInitFail(int i, String s) {
if (videoPlayActivity != null) {
videoPlayActivity.onInitFail(i, s);
}
}
@Override
public void onConnectSuccess() {
if (videoPlayActivity != null) {
videoPlayActivity.onConnectSuccess();
}
}
@Override
public void onConnectFail(int i, String s) {
if (videoPlayActivity != null) {
videoPlayActivity.onDisconnected(i, s);
}
}
@Override
public void onStopped() {
if (videoPlayActivity != null) {
videoPlayActivity.onStopped();
}
}
@Override
public void onDisconnected(int i) {
Log.d(TAG, "onDisconnected i = " + i);
if (videoPlayActivity != null) {
videoPlayActivity.onDisconnected(i, "onDisconnected");
}
}
@Override
public void onPlayInfo(String s) {
Log.d(TAG, "onPlayInfo s = " + s);
}
@Override
public void onRenderedFirstFrame(int i, int i1) {
Log.d(TAG, "onRenderedFirstFrame i = " + i + ", i1 = " + i1);
}
@Override
public void onVideoSizeChanged(int i, int i1) {
Log.d(TAG, "onVideoSizeChanged i = " + i + ", i1 = " + i1);
}
@Override
public void onRequestPermission(String s) {
if (videoPlayActivity != null) {
videoPlayActivity.onRequestPermission(s);
}
}
}
函数说明:
3 SDK高级功能
3.1 切换分辨率,比特率,帧率
4 SDK开发指南
sdk的api函数都封装到了com.mci.commonplaysdk.BgsSdk.java类中,具体函数描述如下
4.1 构造函数
- 函数原型:
public BgsSdk(Activity activity)
- 函数说明:BgsSdk构造函数。
4.2 类函数
4.2.1 preLoad
- 函数原型:
public 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加载成功后再进行。
- 函数原型:
public 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成功后再进行。
- 函数原型:
public 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
- 函数原型:
public void pause()
- 函数说明:暂停连接云手机,只有在调用startPhone后才生效,与resume对应。
resume
- 函数原型:
public void resume()
- 函数说明:恢复连接云手机,只有在调用startPhone后才生效,与pause对应。
stopPhone
- 函数原型:
public void stopPhone()
- 函数说明:释放云手机。
画质
setStreamConfig
- 函数原型:
public void setStreamConfig(int width, int height, int bitrate, int fps)
- 函数说明:设置视频宽高,帧率,码率,须在第一帧画面返回后设置才能生效。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
width | int | 压码视屏宽 |
height | int | 压码视频高 |
bitrate | int | 视频码率,单位kBps |
fps | int | 视频帧率 |
数据透传到云手机
sendKeyEvent
- 函数原型:
public void sendKeyEvent(int action, int keyCode)
- 函数说明:透传键值事件到云手机。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
action | int | 事件行为,按下或抬起,对应 KeyEvent.ACTION_DOWN和KeyEvent.ACTION_UP |
keyCode | int | 具体按键值,传linux键值,对应KeyEvent.getScanCode() |
sendSensorData
- 函数原型:
public int sendSensorData(int type, float[] data)
- 函数说明:透传传感器数据到云手机。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
type | int | 传感器类型,详见传感器类型 |
data | float[] | 传感器数据 |
- 返回结果:0成功,其他失败。
sendLocationData
- 函数原型:
public int sendLocationData(float longitude,
float latitude,
float altitude,
float floor,
float horizontalAccuracy,
float verticalAccuracy,
float speed,
float direction,
String timestamp)
- 函数说明:发送位置数据到云手机。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
longitude | float | 纬度(度) |
latitude | float | 经度(度) |
altitude | float | 高度(米) |
floor | float | 楼层 |
horizontalAccuracy | float | 水平精度(米) |
verticalAccuracy | float | 垂直精度(米) |
speed | float | 速度(米/秒) |
direction | float | 方向 |
timestamp | String | 时间戳 |
- 返回结果:0成功,其他失败。
sendTransparentMsgReq
- 函数原型:
public int sendTransparentMsgReq(int type, String data, String binderService)
- 函数说明:透传信息到云手机。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
type | int | 自定义类型 |
data | String | 具体数据 |
binderService | String | 云端binder service名称 |
- 返回结果:0成功,其他失败。
sendJoystickInput
- 函数原型:
public int sendJoystickInput(int index, int pressed, int buttons,
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
- 函数原型:
public void setExtraData(int type, String info)
- 函数说明:透传账号信息到云手机。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
type | int | 账号信息自定义类型 |
info | String | 账号数据 |
sendAVData
- 函数原型:
public int sendAVData(int avType, int frameType, byte[] data)
- 函数说明:发送音视频数据到云手机,目前只支持H264及aac。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
avType | int | 用于区分音频(211)及视频(212), 具体值参考传感器类型 |
frameType | int | 音视频不同的编码类型,详情参考音视频编码帧类型 |
data | byte[] | 具体音视频编码帧数据 |
- 返回结果:0成功,其他失败。
copyToRemote
- 函数原型:
public void copyToRemote(byte[] value)
- 函数说明:透传剪切板数据到云手机的剪切板中,间接实现客户端到云手机的粘贴。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
value | byte[] | 剪切板的字符串数据要转为byte[] |
sendInputString
- 函数原型:
public void sendInputString(byte[] value)
- 函数说明:透传字符串数据到云手机。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
value | byte[] | 字符串数据要转为byte[] |
获取设备编号
getPadCode
- 函数原型:
public String getPadCode()
- 函数说明:获取设备编号,调用startGame后可获取。
- 返回结果:返回设备编号。
音视频采集
setUseSdkCollectVideo
- 函数原型 :
public void setUseSdkCollectVideo(boolean isSdkCollectVideo)
- 函数说明:控制是否由SDK采集摄像头数据并上传。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
isSdkCollectVideo | boolean | true,由sdk采集摄像头数据; false, 由客户端自己处理 |
setAVEncodeParams
- 函数原型 :
public void setAVEncodeParams(AVEncodeParamsBean paramsBean)
- 函数说明:设置sdk采集摄像头数据压码参数。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
paramsBean | AVEncodeParamsBean | 摄像头采集参数 |
openCamera
- 函数原型 :
public void openCamera()
- 函数说明:打开摄像头并采集数据上传到云端,通常不需要主动调用此函数,只有当用户未授权摄像头权限,sdk回调通知用户去授权且等用户授权后才需要调用,权限请求接口回调详见BgsSdkCallback中onRequestPermission
setUseSdkCollectAudio
- 函数原型 :
public void setUseSdkCollectAudio(boolean isSdkCollectAudio)
- 函数说明:控制是否由SDK采集麦克风数据并上传。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
isSdkCollectAudio | boolean | true,由sdk采集麦克风数据, false, 由客户端自己处理 |
openMic
- 函数原型 :
public void openMic()
- 函数说明:打开麦克风并采集数据上传到云端,通常不需要主动调用此函数,只有当用户未授权麦克风权限,sdk回调通知用户去授权且等用户授权后才需要调用,权限请求接口回调详见BgsSdkCallback中onRequestPermission
其他
getVersion
- 函数原型:
public String getVersion()
- 函数说明:获取sdk版本号。
- 返回结果:返回sdk版本号。
audioPauseOrResume
- 函数原型 :
public void audioPauseOrResume(boolean isResume)
- 函数说明:控制sdk是否静音及恢复播放声音。
- 参数说明:
参数 | 类型 | 说明 |
---|---|---|
isResume | boolean | true,恢复播放声音;false,设置静音 |