中文简体 English
爱为物联Android端SDK使用文档
以Android-app-sdk-demo工程搭建为例,(IDE为Androidstudio,AS),为开发者介绍SDK对接过程。
点击下载
快速接入
- 下载demo压缩包解压
- 拷贝libs下aar文件到自己工程对应的目录下
- build.gradle引入如下代码
添加完成后的AS工程目录如下所示:dependencies { ... implementation(name: 'ipclibrary-2021_12_13', ext: 'aar') }
Ivyiot-android-sdk 是爱为物联为帮助第三方开发者,在Android App端快速实现ipc的使用的sdk包。包含了初始化sdk,连接ipc,控制ipc,音视频直播,音视频回放几个部分的API使用简介。
SDK初始化
一般建议在application中初始化。
/** 设置SDK日志存储路径及日志级别,正式发布级别设置为 LogLevel.NO*/
SDKManager.getInstance().setLog(logFilePath, LogLevel.ALL);//在init之前调用
/** 初始化,必须放在使用SDK前,全局仅需调用一次*/
SDKManager.getInstance().init(this);
SDK主要流程
连接设备
步骤
- 初始设备上电后进行配网(二维码扫描、声波)
- 设备配网成功后,通过
SDKManager.getInstance().discoveryDeviceInWLAN
获取到设备UID等信息- 创建IvyCamera对象,必须赋值UID、设备的用户名(usrName,初始值为admin)、设备的密码(password,初始密码可用
SDKManager.getInstance().getFactoryPassword
获取)- 调用
IvyCamera.loginDevice
实现连接- 调用
IvyCamera.destroy
释放连接
扫描二维码配网
初始状态设备的镜头扫描二维码进行配网
- 将wifi的ssid和密码通过
SDKManager.getInstance().createQRInfo
创建文本信息 - 据此文本信息生成对应的二维码图片,供设备扫描,等待设备播放扫码成功的语音提示后,等待设备接入网络即可。
- 在此期间,APP可以循环调用
SDKManager.getInstance().discoveryDeviceInWLAN
方法,直到搜索到指定设备则代表配网成功(可以通过搜索到的设备的uid与设备机身上的uid信息做比对筛选)。注:本sdk不提供识别二维码和生成二维码图片的功能,APP开发者可通过第三方库(zxing)自行实现。
声波配网
手机端播放声波信息让处于初始状态的设备接收
- 将wifi的ssid和密码通过
SDKManager.getInstance().startSoundWaveAdd
播放对应的声波信息; - 播放完声波等待设备配网成功的语音提示后,等待设备接入网络
- 在此期间,APP可以循环调用
SDKManager.getInstance().discoveryDeviceInWLAN
方法,直到搜索到指定设备则代表配网成功(可以通过搜索到的设备的uid与设备机身上的uid信息做比对筛选)。
局域网搜索
搜索手机当前连接wifi下的已配网设备
- 调用
SDKManager.getInstance().discoveryDeviceInWLAN
获取到当前局域网下所有设备 - 匹配对应的设备信息进行IvyCamera对象的创建
实时播放
步骤
1.创建播放器,在布局中引入如下代码
<com.ivyiot.ipclibrary.video.VideoSurfaceView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="3dp" />
2.调用IvyCamera.loginDevice
连接登录设备
3.登录成功后调用VideoSurfaceView.openVideo
开启实时播放
4.关闭或者离开界面时需要调用VideoSurfaceView.closeVideo
关闭释放资源
实例代码如下
```
...
camera.loginDevice(new ISdkCallback() {
@Override
public void onSuccess(Object result) {
//打开视频,命令结果通过回调方法接收,见 IVideoListener
videoview.openVideo(camera, this);
}
@Override
public void onError(int errorCode) {
}
@Override
public void onLoginError(int errorCode) {
}
});
...
if (null != videoview) {//close Video
videoview.closeVideo();
}
```
说明
- 实时播放成功后可以进行以下操作:录像、拍照、画面翻转、对讲、云台控制、监听等,其中设备控制该接口的如云台控制和镜头显示功能、对讲,属于限制级接口,要优选通过判断设备的能力集来调用,设备能力集请查看
DevAbility
对象的属性值来判断具体方法。
//开始录像。需要成功获取到视频流数据之后才有效。
//filePath 视频文件存储的全路径(包含文件名,后缀为.mp4)
IvyCamera.startRecord(filePath, new ISdkCallback(){});
//停止录像
IvyCamera.stopRecord(new ISdkCallback(){});
//播放器包含的抓拍功能 hasSound是否需要抓拍声音
VideoSurfaceView.snap(boolean hasSound)
/**
* 获取 ipc 的镜像翻转设置
*
* @param callback 回调中返回 Integer 数组,包含两个元素,第一个为 mirror 的开关状态,第二个为 flip 的开关状态。1 表示开,0 表示关。
*/
IvyCamera.getMirrorAndFlip(new ISdkCallback<Integer[]>(){})
/**
* 设置视频翻转开关
*
* @param enable 1 开,0 关
*/
IvyCamera.setFlip(int enable, ISdkCallback<Integer> callback)
/**
* 设置视频镜像开关
*
* @param enable 1 开,0 关
*/
IvyCamera.setMirror(int enable, ISdkCallback<Integer> callback)
//打开对讲
IvyCamera.openTalk(new ISdkCallback() {
@Override
public void onSuccess(Object result) {
if (null == talkThread) {//将MIC采集的信息发往设备端
talkThread = new TalkThread(IvyCamera, true);
talkThread.startTalk();
talkThread.start();
}
}
@Override
public void onError(int errorCode) {
}
@Override
public void onLoginError(int errorCode) {
}
});
//关闭对讲
IvyCamera.closeTalk(new ISdkCallback() {
@Override
public void onSuccess(Object result) {
if (null != talkThread) {//停止发送数据
talkThread.stopTalk();
talkThread = null;
}
}
@Override
public void onError(int errorCode) {
}
@Override
public void onLoginError(int errorCode) {
}
});
//打开监听
IvyCamera.openAudio(new ISdkCallback() {
@Override
public void onSuccess(Object result) {
if (null == audioThread) {//开启手机播放
audioThread = new AudioThread(camera, true);
audioThread.startAudio();
audioThread.start();
}
}
@Override
public void onError(int errorCode) {
}
@Override
public void onLoginError(int errorCode) {
}
});
//关闭
IvyCamera.closeAudio(new ISdkCallback() {
@Override
public void onSuccess(Object result) {
if (null != audioThread) {//关闭播放
audioThread.stopAudio();
audioThread = null;
}
}
@Override
public void onError(int errorCode) {
}
@Override
public void onLoginError(int errorCode) {
}
});
云台控制,发送了对应方向命令后,需要调用一次停止才能结束此次操作,建议用控件的onTouch事件去处理。
//控制命令详情见PTZCmd @Override public boolean onTouch(View v, MotionEvent event) { try { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: {// XXX MotionEvent.ACTION_DOWN switch (v.getId()) { case "ptz_up": IvyCamera.ptzControl(PTZCmd.PTZ_MOVE_UP, null); break; case "ptz_down": IvyCamera.ptzControl(PTZCmd.PTZ_MOVE_DOWN, null); break; case "ptz_left": IvyCamera.ptzControl(PTZCmd.PTZ_MOVE_LEFT, null); break; case "imgbtn_ptz_right": IvyCamera.ptzControl(PTZCmd.PTZ_MOVE_RIGHT, null); break; case "ptz_center": IvyCamera.ptzControl(PTZCmd.PTZ_RESET, null); break; } } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: { switch (v.getId()) { case "ptz_up": case "ptz_down": case "ptz_left": case "ptz_center": IvyCamera.ptzControl(PTZCmd.PTZ_STOP, null); break; } } break; } } catch (Exception ex) { ex.printStackTrace(); } return false; // return false表示系统会继续处理 }
切换清晰度
... // 1、订阅 设备 的事件消息 IvyCamera.addObserver(this); //2、获取设备信息 IvyCamera.getDevInfo(new ISdkCallback(){}); //3、获取能力集 IvyCamera.getDevAbility(new ISdkCallback(){}); //4、获取清晰度选项 EDefinitionItem.EResolutionMode[] definitionItem = IvyCamera.getDefinitionItems(DevAbility, DevInfo); //5、在观察者监听里面获取当前视频流的档位,对应清晰度选项的数组下标 @Override public void update(Observable o, Object arg) { if (arg != null) { Message msg = (Message) arg; Log.e(TAG, "update: " + msg.what + ";data=" + msg.obj); switch (msg.what){ case EventID.IVY_CTRL_MSG_VIDEO_STREAM_MODE://对应清晰度的下标 int hdsdValue = (int) msg.obj; break; } } } //6、设置清晰度 boolean streamMode = definitionItem.length == 2 && !CommonUtil.is313EPlatform(devAbility); if (streamMode) {//主/子码流切换 changeStream(1); if (index == 0) { IvyCamera.setStreamType(StreamMode.STREAM_MAIN); } else { IvyCamera.setStreamType(StreamMode.STREAM_SUB); } VideoSurfaceView.closeVideo(); VideoSurfaceView.openVideo(camera, this); } else {//三档切换 IvyCamera.changeDefinition(0, new ISdkCallback(){}); } //取消订阅设备消息事件 IvyCamera.deleteObserver(this); ...
SD卡回放
步骤
1.创建播放器,在布局中引入如下代码<com.ivyiot.ipclibrary.video.PBVideoSurfaceView android:id="@+id/pbvideoview" android:layout_width="match_parent" android:layout_height="260dp" android:layout_marginTop="3dp" />
2.根据日期以及类型查询SD卡中的设备中录像文件
//注意:Calendar类的月份从0开始。 Calendar cal = Calendar.getInstance(); //2019.9.23 00:00:00 cal.set(2022, 0, 5, 0, 0, 0); int todayStart = (int) (cal.getTimeInMillis() / 1000); //2019.9.23 23:59:59 cal.set(2022, 0, 5, 23, 59, 59); int todayEnd = (int) (cal.getTimeInMillis() / 1000); /** * 获取一段时间内的 sd 录像文件列表。 * <br> * 因一天的录像数最多可超1000,因此建议分时间段查询,查询时间段不得超过一天。 * * @param startTime 搜索起始时间(UTC时间,精确到秒) * @param endTime 搜索结束时间(UTC时间,精确到秒) * @param recordType 文件类型: 0 schedule, 1 alert, 2 all */ IvyCamera.getPBList(todayStart, todayEnd, recordType, new ISdkCallback<ArrayList<PlaybackRecordInfo>>() { @Override public void onSuccess(ArrayList<PlaybackRecordInfo> result) { recordIvyArr = result; Log.e(TAG, "onSuccess: " + recordIvyArr.size()); } @Override public void onError(int errorCode) { Log.e(TAG, "onError: " + errorCode); } @Override public void onLoginError(int errorCode) { } });
选择查询出来的录像文件,调用
PBVideoSurfaceView.openPBVideo(IvyCamera, recordIvyArr.get(position), this)
打开回放;调用
PBVideoSurfaceView.closePBVideo()
关闭当前回放录像;