萤石云视频Android SDK接口使用说明
1. 简介
本文档用于说明萤石开放平台SDK Android版本接口之间的关系以及接口调用顺序,对开放平台SDK Android版本各接口都有详细的说明。主要分为四个部分,第一部分为名词解释;第二部分为SDK环境配置;第三部阐述了开放SDK的主要调用流程;第四部分对各模块接口进行了详细的说明。
2. 名词解释
名词 | 释义 |
---|---|
accessToken | 访问令牌,由server返回给client用于认证 |
cameraId | 摄像头唯一标志 |
AppKey | 应用程序key AppKey的申请可以参阅: https://open.ys7.com/view/app/app_edit.html |
deviceSerial | 设备唯一标志 |
OSD | 视频当前时间 |
PTZ | 云台控制,可以通过终端控制操作设备 |
3. 功能介绍
V3.0: 账号对接(授权登录、sdk接口登录)、获取摄像头列表、直播预览、查看回放(SD卡、云存储)、设备添加删除、设备的设置功能(h5)、设备控制接口(云台、镜头画面)、WiFi配置、视频本地录像、视频截屏、告警消息等。
V3.1: 安全验证接口、获取设置设备验证码、数据解密接口等,主要功能是完成UI版本的开源项目。
4. SDK配置
1、新建android app工程
2、导入EZOpenSDK.jar(拷贝到libs/下)
3、拷贝lib*.so到libs/armeabi/
4、设置AndroidManifest.xml
权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_OWNER_DATA" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
应用组件: 用于sdk中间页显示,包含登录、开通云存储等。
<activity
android:name="com.videogo.main.EzvizWebViewActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|keyboardHidden"
</activity>
用于接收网络变化刷新SDK网络状态,接收中间页登录成功消息启动其他界面。
<receiver
android:name=".EzvizBroadcastReceiver"
android:exported="false" >
<intent-filter>
<action android:name="com.videogo.action.OAUTH_SUCCESS_ACTION" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
5. 快速接入示范
本节旨在引导开发者进行快速接入,通过介绍几个关键的接口,并给出对应的界面和接口,以及代码范例,让开发者对sdk有个初步了解. 首先请下载并安装萤石云app, 登陆以后,进入的是监控列表界面,如下所示 [图中橙色矩形框仅作为标注,并非原生app界面]。
5.1 获取摄像头列表
new Thread(new Runnable() {
@Override
public void run() {
try {
List<EZCameraInfo> result = null;
result = mEZOpenSDK.getCameraList(0, 10);
return result;
} catch (BaseException e) {
mErrorCode = e.getErrorCode();
return null;
}
}
}).start();
说明:通过调用getCameraList(接口中包含网络操作,需要在线程中调用),可以得到一个列表,列表每一项包含一个摄像头的信息。开发者可以通过list adapter将列表展示
代码位于
src\com\videogo\ui\cameralist\EZCameraListActivity.java
5.2 添加设备
说明:需要添加设备时,可以点击界面1中的加号(+),进入界面2,界面2是一个二维码扫描,用户可以通过扫描二维码获取设备序列号,也可以点击界面右上角的图标(橙色标注),进入界面3,界面3是一个手动输入序列号界面。
界面2(二维码扫描)代码在
src\com\videogo\scan\main\CaptureActivity.java
界面3(手动输入)代码在
src\com\videogo\ui\devicelist\ SeriesNumSearchActivity
用户输入设备序列号,只有当设备没有被其他人添加,并且设备已经在线(注册上平台)时,才能够被添加,因此,必须要查询一下该设备状态,调用的接口是probeDeviceInfo
try {
mEZProbeDeviceInfo = mEZOpenSDK.probeDeviceInfo(serialNo);
sendMessage(MSG_QUERY_CAMERA_SUCCESS);
LogUtil.infoLog(TAG, "probeDeviceInfo success");
} catch (BaseException e) {
sendMessage(MSG_QUERY_CAMERA_FAIL, e.getErrorCode());
LogUtil.infoLog(TAG, " probeDeviceInfo fail :" + e.getErrorCode());
e.printStackTrace();
}
如果该接口返回成功,则说明该设备状态正常,继续调用addDevice接口添加。
try {
boolean result = mEZOpenSDK.addDevice(mSerialNoStr, mVerifyCode);
// 添加成功
sendMessage(MSG_ADD_CAMERA_SUCCESS);
} catch (BaseException e) {
sendMessage(MSG_ADD_CAMERA_FAIL, e.getErrorCode());
LogUtil.errorLog(TAG, "add camera fail");
}
如果该接口返回错误,开发者需要处理以下几个错误码,告诉用户该设备不可添加的原因:
20020 设备在线,已经被自己添加 (给出提示)
20022 设备在线,已经被别的用户添加 (给出提示)
20023 设备不在线,未被用户添加 (这里需要调用wifi一键配置)
20024 设备不在线,已经被别的用户添加 (给出提示)
20029 设备不在线,已经被自己添加 (给出提示)
至此,一个简单的设备添加就完成了。
5.3 Wifi一键配置
在上述调用接口probeDeviceInfo
过程中,如果返回的错误码是20023,说明设备还没有联网,这时需要让设备联网,如果是有线设备,需要提示用户插入网线。如果是无线设备,则需要进行wifi配置。
开始一键配置需要调用startConfigWifi接口:
new Thread(new Runnable() {
@Override
public void run() {
mEZOpenSDK.startConfigWifi(AutoWifiConnectingActivity.this, wifiSSID, wifiPassword, deviceDiscoveryListener);
}
}).start();
结束一键配置需要调用stopConfigWiFi接口(需要传入一个回调函数,用于处理事件):
DeviceDiscoveryListener deviceDiscoveryListener = new DeviceDiscoveryListener() {
@Override
public void onDeviceLost(DeviceInfo deviceInfo) {
}
@Override
public void onDeviceFound(DeviceInfo deviceInfo) {
Message msg = new Message();
msg.what = 0;
msg.obj = deviceInfo;
defiveFindHandler.sendMessage(msg);
}
@Override
public void onError(String error, int errorCode) {
LogUtil.errorLog(TAG, error + "errorCode:" + errorCode);
}
};
Handler defiveFindHandler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 0) {
DeviceInfo deviceInfo = (DeviceInfo) msg.obj;
if (deviceInfo == null || deviceInfo.getState() == null) {
LogUtil.debugLog(TAG, "接收到无效的bonjour信息 为空");
return;
}
// 设备序列号 相等 说明是我们要添加的设备 否则不是
if (serialNo != null && serialNo.equals(deviceInfo.getSerialNo())) {
if ("WIFI".equals(deviceInfo.getState().name())) {
if (isWifiConnected) {
LogUtil.i(TAG, "defiveFindHandler: receiver WIFI while isWifiConnected is true");
return;
}
isWifiOkBonjourget = true;
isWifiConnected = true;
LogUtil.debugLog(TAG, "接收到设备连接上wifi信息 " + deviceInfo.toString());
t2 = System.currentTimeMillis();
stopWifiConfigOnThread();
changeStatuss(STATUS_REGISTING);
} else if ("PLAT".equals(deviceInfo.getState().name())) {
if (isPlatConnected) {
LogUtil.i(TAG, "defiveFindHandler: receiver PLAT while isPlatConnected is true");
return;
}
isPlatBonjourget = true;
isPlatConnected = true;
LogUtil.debugLog(TAG, "接收到设备连接上PLAT信息 " + deviceInfo.toString());
t3 = System.currentTimeMillis();
cancelOvertimeTimer();
changeStatuss(STATUS_ADDING_CAMERA);
}
}
}
};
};
该回调用于处理WIFI和PLAT事件。
WIFI表示设备已经连上WIFI, PLAT表示设备已经注册上平台。一旦设备注册上平台之后,就可以调用addDevice进行添加
5.4 设备预览
预览视频的代码参见
src\com\videogo\ui\realplay\EZRealPlayActivity.java
if (mCameraInfo != null) {
mEZPlayer = mEZOpenSDK.createPlayer(this, mCameraInfo.getCameraId());
if(mEZPlayer == null)
return;
mEZPlayer.setHandler(mHandler);
mEZPlayer.setSurfaceHold(mRealPlaySh);
mEZPlayer.startRealPlay();
}
代码说明:
1、创建EZPlayer对象需要一个cameraId,即摄像头的唯一id,这个cameraId可从EZCameraInfo对象中获取
2、需要创建一个handler,用于接收播放器消息,比如播放器播放成功,失败等消息
public boolean handleMessage(Message msg) {
switch (msg.what) {
case EZRealPlayConstants.MSG_REALPLAY_PLAY_SUCCESS:
handlePlaySuccess(msg);
break;
case EZRealPlayConstants.MSG_REALPLAY_PLAY_FAIL:
handlePlayFail(msg.arg1, msg.arg2);
break;
}
3、播放需要一个surfaceView,因此在你的xml layout 文件重要放置一个SurfaceView
<RelativeLayout
android:id="@+id/realplay_play_rl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/black_bg" >
<SurfaceView
android:id="@+id/realplay_sv"
android:layout_width="600dp"
android:layout_height="200dp"
android:layout_alignParentTop="true"
android:layout_centerInParent="false"
android:background="@android:color/transparent" />
</RelativeLayout>
在surface创建的过程中,保存SurfaceHolder对象:
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (mEZPlayer != null) {
mEZPlayer.setSurfaceHold(holder);
}
mRealPlaySh = holder;
}
4、调用startRealPlay()
整个代码参见
src\com\videogo\ui\realplay\EZRealPlayActivity.java
6. 接口
6.1 SDK整体接入流程
- 用户使用SDK初始化后的第一步通过账号对接流程(参考http://service.ys7.com/question/answer.html?id=21222&user_type=0&selected_type=热门问题考) 获取accessToken的对象
- 通过EZOpenSDK的setAccessToken方法向SDK设置AccessToken;
- 然后可以通过设备列表接口获取设备信息;
- 针对设备预览、回放、设备操作(云台控制、设备显示设置)、查看告警列表等功能接口调用;
- 预览成功以后才能抓图、录像、开关声音;
- 语音对讲操作;
- 回放成功以后才能抓图、录像、开关声音;
- WiFi配置之前要先通过设备序列号查询设备是否添加过。
注意: 开发者调用的主要接口都在EZOpenSDK.java 和 EZPlayer.java这2个类中
6.2 SDK初始化
名称 | boolean initLib(Application application, String appKey, String loadLibraryAbsPath) |
---|---|
参数 | @param application客戶端app的 Application 對象 @param appKey 客戶端app申請的appkey @param loadLibraryAbsPath 指定.so库在sd卡的路径 |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | SDK 初始化 loadLibraryAbsPath 如果需要将.so文件放在sd卡上,该参数指定路径,否则置空表示默认放在手机存储上 |
示例 | 在应用Application的onCreate回调函数中初始化SDK //正式平台设置 EZOpenSDK.initLib(this, APP_KEY, null); //设置APP_KEY |
6.3 账号对接模块
说明:
1、使用 openLoginPage 方法获取EZAccessToken对象accessToken;
2、把获取的AccessToken字符串通过 setAccessToken 方法对SDK进行accessToken设置;
3、用户可以存储accessToken在本地,以便下次启动时直接把accessToken的值设置到SDK;
4、6.3.1和6.3.2为两种不同的获取用户token方式,可以根据自己的业务选择一个,参考上面6.1.
6.3.1 授权登录-打开登录页,萤石标准
名称 | void openLoginPage() |
---|---|
参数 | |
返回值 | void |
版本 | 3.0 |
说明 | 打开授权登录中间页面,登录成功后发送播放com.videogo.action.OAUTH_SUCCESS_ACTION |
示例 | 在收到OAUTH_SUCCESS_ACTION广播后的代码可以这么写: if(action.equals(Constant.OAUTH_SUCCESS_ACTION)) { Intent toIntent = new Intent(context, EZCameraListActivity.class); toIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //保存token及token超时时间 EZAccessToken token = mEZOpenSdk.getEZAccessToken(); //保存token,获取超时时间,在token过期时重新获取 context.startActivity(toIntent); //启动camera list |
6.3.2 接口登录-调用sdk接口
6.3.2.1 获取开通萤石服务的短信
名称 | boolean getOpenEzvizServiceSMSCode(String mobileNumber) |
---|---|
参数 | @param mobileNumber 手机号码 |
返回值 | @return 成功返回true,失败返回false @throws BaseException |
版本 | 3.2 |
说明 | 获取开通萤石服务的短信验证码 |
示例 |
6.3.2.2 开通萤石服务
名称 | boolean openEzvizService(String mobileNumber,String smsCode) |
---|---|
参数 | @param mobileNumber手机号码 @param smsCode收到的开通服务的短信验证码 |
返回值 | @return 成功返回true,失败返回false @throws BaseException |
版本 | 3.2 |
说明 | 开通萤石服务 |
示例 |
6.3.2 setAccessToken
名称 | void setAccessToken(String accessToken) |
---|---|
参数 | String accessToken |
返回值 | 3.0 |
说明 | 授权登录以后给EZOpenSDK设置AccessToken |
示例 |
6.3.3 getEZAccessToken
名称 | EZAccessToken getEZAccessToken() |
---|---|
参数 | |
返回值 | @return token |
版本 | 3.0 |
说明 | 获取登录token 包含2个字段,一个是token string本身,另外一个表示过期时间,单位为秒,获取到的值一般为604800秒,即7天。该函数一般在收到登陆成功的广播OAUTH_SUCCESS_ACTION后调用。 |
示例 | //保存token,获取超时时间,当token过期时重新登录 EZAccessToken token = mEZOpenSdk.getEZAccessToken(); |
6.3.4 登出
名称 | void logout() |
---|---|
参数 | |
返回值 | void |
版本 | 3.0 |
说明 | 登出账号 |
示例 |
6.3.5 获取用户信息
名称 | EZUserInfo getUserInfo() |
---|---|
参数 | |
返回值 | @return 返回 EZUserInfo 对象 @throws BaseException@throws BaseException |
版本 | 3.2 |
说明 | 获取用户信息;用户信息包含:用户名,头像地址等 |
示例 |
6.3.6 修改密码页面
名称 | void openChangePasswordPage() |
---|---|
参数 | |
返回值 | |
版本 | 3.3 |
说明 | 可以通过该页面修改密码 |
示例 |
6.4 设备模块
接口说明:
- 通过获取摄像头列表的接口(支持分页),你可以从萤石云服务器获取当前登录账号的设备列表,你可以根把返回的EZCameraInfo的数组在你的UI展示设备,然后你可以通过cameraId进行预览、设备云存储录像或者SD卡录像列表获取等操作;
- 通过deviceSerial对摄像头列表中的设备进行删除操作、中间页面设置设备;
- 添加设备时,先调用getCameraInfo获取摄像头信息,该函数返回值(见函数详细说明 )会提示摄像头是否已经添加。
a) 如果该摄像头已经被添加,则添加流程中止,此时开发者应该提示用户已添加
b) 如果摄像头未被添加,则调用无线配置wifiConfig, 并进一步通过addDevice来添加 无线设备的添加,demo中有具体的例子。
对于有线设备的添加,添加过程跟无线是一样的,先调getCameraInfo查询信息,如果设备没有被添加,则继续调用addDevice添加。只不过没有wifi配置这一步。
6.4.2 WiFi一键配置流程
特别说明: 账户下删除设备重新wifi配置并且添加过程中,请在重置设备等待2分钟以后再调用wifi配置的相关接口可以提高wifi配置的成功率,否则会降低成功率,因为重置设备以后我们平台将在2分钟内得到设备下线的状态,只有平台认为下线了,wifi配置成功率才会高。
6.4.3 获取摄像头列表
名称 | List<EZCameraInfo> getCameraList(int pageStart,int pageSize) throws BaseException |
---|---|
参数 | @param pageStart 分页当前页码(从0开始) @param pageSize 分页每页数量 (建议20以内) |
返回值 | @return 摄像头列表 @throws BaseException |
版本 | 3.0 |
说明 | 该接口用于应用获取摄像头列表 返回的结构类型可以参阅5.11.1 |
示例 |
6.4.4 获取摄像头信息
名称 | EZCameraInfo getCameraInfo(String deviceSerial) throws BaseException |
---|---|
参数 | @param deviceSerial 设备序列号 |
返回值 | @return 摄像头信息 @throws BaseException |
版本 | 3.0 |
说明 | 根据设备序列号查询摄像头信息,一般在设备添加WiFi配置之前先作一次查询。 调用该函数时,有2种情况: 1. 用户已经添加过该摄像头,那么该调用正常会返回EZCameraInfo 2. 用户没有添加过该摄像头,比如第一次添加设备时,那么该调用返回如下结果, 获得的EZCameraInfo信息为空(因为添加之前,该摄像头还不属于你, 所以会返回空),同时抛出以下异常,开发者根据具体的异常决定进一步的流程: VIDEOGONETSDK_DEVICE_NOT_ONLINE:设备不在线,继续走添加流程。 ERROR_WEB_DIVICE_ONLINE_NOT_ADD:在线未添加,继续走添加流程。 ERROR_WEB_DIVICE_OFFLINE_NOT_ADD:不在线未添加,继续走添加流程。 |
示例 |
6.4.5 获取设备信息
名称 | EZDeviceInfo getDeviceInfo(String cameraId) throws BaseException |
---|---|
参数 | @param cameraId 设备摄像头id |
返回值 | @return 设备信息 @throws BaseException |
版本 | 3.0 |
说明 | 获取设备详细信息 |
示例 |
6.4.5.2 删除设备
名称 | boolean deleteDevice(String deviceSerial) throws BaseException |
---|---|
参数 | @param deviceSerial 设备标志 |
返回值 | @return true 表示成功, false 表示失败 @throws BaseException |
版本 | 3.0 |
说明 | 删除当前账号的设备 |
示例 |
6.4.6 openSettingDevicePage
名称 | void openSettingDevicePage(String deviceSerial) |
---|---|
参数 | @param deviceSerial设备标志(列表接口返回的deviceSerial) |
返回值 | void |
版本 | 3.0 |
说明 | 打开设备设置中间页 |
示例 |
6.4.7 添加设备
名称 | boolean addDevice(String deviceSerial, String deviceCode) throws BaseException |
---|---|
参数 | @param deviceSerial 设备序列号 @param deviceCode 设备验证码 |
返回值 | @return true 表示成功, false 表示失败 @throws BaseException |
版本 | 3.0 |
说明 | 添加设备 |
示例 |
6.4.8 startConfigWiFi
名称 | boolean startConfigWifi(Context context, String ssid, String password, DeviceDiscoveryListener l) |
---|---|
参数 | @param ssid 连接WiFi SSID @param password 连接WiFi 密码 @param l 回调,用于处理连接设备的WiFi配置状态 |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 开始WiFi配置 |
示例 |
6.4.9 stopConfigWiFi
名称 | boolean stopConfigWiFi() |
---|---|
参数 | |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 停止Wifi配置 |
示例 |
6.4.10 尝试查询设备信息
名称 | EZProbeDeviceInfo probeDeviceInfo(String deviceSerial) |
---|---|
参数 | @param deviceSerial 需要查询的设备序列号 |
返回值 | @return 返回 EZProbeDeviceInfo 对象,包含设备简单信息,用于添加目的 @throws BaseException |
版本 | 3.2 |
说明 | 尝试查询设备信息(用于添加设备之前, 简单查询设备信息,如是否在线,是否添加等) |
示例 |
6.4.11 开启布防(活动检测)
名称 | boolean setDefence(boolean isDefence,String deviceSerial) |
---|---|
参数 | |
返回值 | @return true 表示成功, false 表示失败 @throws BaseException |
版本 | 3.2 |
说明 | 根据设备序列号控制设备的活动检测开关接口 |
示例 |
6.4.12 抓取摄像头图片
名称 | String getRealPicture(String deviceSerial,int channelNo) |
---|---|
参数 | @param deviceSerial 设备序列号 @param channelNo 通道号 |
返回值 | @return 图片url @throws BaseException |
版本 | 3.2 |
说明 | 获取抓取摄像头图片的url |
示例 |
6.4.13 获取设备的版本信息
名称 | EZDeviceVersion getDeviceVersion(String deviceSerial) |
---|---|
参数 | @param deviceSerial 设备序列号 |
返回值 | @return 版本号EZDeviceVersion对象 @throws BaseException |
版本 | 3.2 |
说明 | 获取设备的版本信息 |
示例 |
6.4.14 设置摄像机视频是否加密
名称 | boolean setDeviceEncryptStatusEx(boolean isEncrypt, String deviceSerial, String validateCode) |
---|---|
参数 | @param isEncrypt 是否加密 @param deviceSerial 设备序列号 @param validateCode 设备验证码,位于设备机身标签上 |
返回值 | @return true 表示成功, false 表示失败 @throws BaseException |
版本 | 3.4 |
说明 | 视频是否加密开关接口 |
示例 |
6.4.15 修改设备名称
名称 | boolean setDeviceName(String deviceSerial, String deviceName) |
---|---|
参数 | @param deviceSerial 设备序列号 @param deviceName 设备名称 |
返回值 | @return true 表示成功, false 表示失败 @throws BaseException |
版本 | 3.2 |
说明 | 修改设备名称接口 |
示例 |
6.4.16 通过序列号获取设备信息
名称 | EZDeviceInfo getDeviceInfoBySerial(String deviceSerial) |
---|---|
参数 | @param deviceSerial 设备序列号 |
返回值 | @return 设备信息 @throws BaseException |
版本 | 3.2 |
说明 | 获取设备详细信息 |
示例 |
6.4.17 打开云存储页面
名称 | void openCloudPage(String deviceSerial) |
---|---|
参数 | @param deviceSerial 设备序列号 |
返回值 | @throws BaseException |
版本 | 3.2 |
说明 | 打开云存储页面 |
示例 |
6.4.18 获取设备列表
名称 | List <EZDeviceInfo> getDeviceList(int pageIndex, int pageSize) |
---|---|
参数 | @param pageIndex 分页起始页,从0开始 @param pageSize 分页每页数量(建议20以内) |
返回值 | @return 设备列表 @throws BaseException |
版本 | 3.3 |
说明 | 获取用户的设备列表,返回EZDeviceInfo的对象数组 |
示例 |
6.4.19 根据序列号获取探测器列表
名称 | List<EZDetectorInfo> getDetectorList(String deviceSerial) |
---|---|
参数 | @param deviceSerial 设备序列号 |
返回值 @return 探测器列表 @throws BaseException |
|
版本 | 3.3 |
说明 | 根据设备序列号获取设备关联的探测器列表 |
示例 |
6.4.20 设备设置布防状态,兼容A1和IPC设备的布防
名称 | Void setDeviceDefence(String deviceSerial, int defence) |
---|---|
参数 | @param deviceSerial 设备序列号 @param defence 布防状态, IPC布防状态只有0和1, A1有0:睡眠 8:在家 16:外出 |
返回值 | @throws BaseException |
版本 | 3.3 |
说明 | 设备设置布防状态,兼容A1和IPC设备的布防 |
示例 |
6.4.21 根据序列号获取告警列表
名称 | List<EZAlarmInfo> getAlarmListBySerial(String deviceSerial, int pageIndex, int pageSize, Calendar beginTime, Calendar endTime) |
---|---|
参数 | @param deviceSerial 设备序列号 @param pageIndex 分页当前页码(从0开始) @param pageSize 分页每页数量(建议20以内) @param beginTime 搜索时间范围开始时间 @param endTime 搜索时间范围结束时间 |
返回值 | @return EZAlarmInfo对象列表 @throws BaseException |
版本 | 3.3 |
说明 | 根据设备序列号获取告警信息列表,序列号为null时查询整个账户下的告警信息列表 |
示例 |
6.5 设备升级
6.5.2 获取设备升级状态
名称 | EZDeviceUpgradeStatus getDeviceUpgradeStatus(String deviceSerial) |
---|---|
参数 | @param deviceSerial 设备序列号 |
返回值 | @return EZDeviceUpgradeStatus 返回升级状态,包含升级进度等 @throws BaseException |
版本 | 3.2 |
说明 | 获取设备升级状态 |
示例 |
6.5.3 开始升级设备
名称 | void upgradeDevice(String deviceSerial) |
---|---|
参数 | @param deviceSerial 设备序列号 |
返回值 | @throws BaseException |
版本 | 3.2 |
说明 | 开始升级设备 |
示例 |
6.6 告警信息模块
6.6.2 获取告警信息列表
名称 | List<EZAlarmInfo> getAlarmList(String cameraID, int pageStart, int pageSize, Calendar startTime, Calendar endTime) throws BaseException |
---|---|
参数 | @param cameraID 设备摄像头id @param pageStart 分页当前页码(从0开始) @param pageSize 分页每页数量(建议20以内) @param startTime 搜索时间范围开始时间 @param endTime 搜索时间范围结束时间 |
返回值 | @return 告警信息列表 @throws BaseException |
版本 | 3.0 |
说明 | 获取指定设备的告警信息列表 |
示例 |
6.6.3 设置告警条目状态
名称 | boolean setAlarmStatus(List<String> alarmIdList,EZAlarmStatus alarmStatus) throws BaseException |
---|---|
参数 | @param alarmIdList 告警信息Id数组(可以只有一个Id) @param alarmStatus 告警状态,已读 |
返回值 | @return true 表示成功, false 表示失败 @throws BaseException |
版本 | 3.0 |
说明 | 设置告警状态 |
示例 |
6.6.4 删除告警信息
名称 | boolean deleteAlarm(List<String> alarmIdList) throws BaseException |
---|---|
参数 | @param alarmIdList 告警list |
返回值 | @return true 表示成功, false 表示失败 @throws BaseException |
版本 | 3.0 |
说明 | 批量删除告警 |
示例 |
6.7 留言消息模块
6.7.2 获取未读消息数
名称 | int getUnreadMessageCount(String deviceSerial,EZMessageType messageType) |
---|---|
参数 | @param deviceSerial 需要获取的设备序列号,为空时返回账户下所有设备的未读消息数 @param messageType 消息类型: EZMessageTypeAlarm 告警消息,EZMessageTypeLeave 留言消息 |
返回值 | @return 未读消息数 @throws BaseException |
版本 | 3.2 |
说明 | 获取未读消息数 |
示例 |
6.7.3 获取留言消息列表
名称 | List<EZLeaveMessage> getLeaveMessageList(String deviceSerial, int pageIndex, int pageSize, Calendar beginTime, Calendar endTime) |
---|---|
参数 | @param deviceSerial 设备序列号(可为空),为空时返回账户下所有设备的留言消息 @param pageIndex 当前分页,从0开始 @param pageSize 分页大小 @param beginTime 开始时间 @param endTime 结束时间 |
返回值 | @return 留言EZLeaveMessage列表 @throws BaseException |
版本 | 3.2 |
说明 | 获取留言消息列表 |
示例 |
6.7.4 批量设置留言消息已读
名称 | boolean setLeaveMessageStatus(List<String> msgIdList, EZMessageStatus messageStatus) |
---|---|
参数 | @param msgIdList 留言消息Id数组(最大数量为10,允许只有1个),多个ID以半角逗号隔开,如:1234565,124344 @param messageStatus 需要设置的留言状态,目前只支持 EZMessageStatusRead(已读); |
返回值 | @return true 表示成功, false 表示失败 @throws BaseException |
版本 | 3.2 |
说明 | 批量设置留言消息已读功能 |
示例 |
6.7.5 批量删除留言消息
名称 | boolean deleteLeaveMessages(List<String> msgIdList) |
---|---|
参数 | @param msgIdList 留言消息Id数组(最大数量为10,允许只有1个),多个ID以半角逗号隔开,如:1234565,124344 |
返回值 | @return true 表示成功, false 表示失败 @throws BaseException |
版本 | 3.2 |
说明 | 批量删除留言消息 |
示例 |
6.7.6 获取语音留言数据
名称 | boolean getLeaveMessageData(Handler handler, EZLeaveMessage msg, EZLeaveMsgController.EZLeaveMsgGetDataCb callback) |
---|---|
参数 | @param handler handler,用于发送成功或者失败消息 @param msg 留言消息 @param callback 获取留言消息数据回调 |
返回值 | @return true表示成功 false表示失 比如当前有留言消息正在下载过程中,又重复调用 下载失败返回 MSG_LEAVEMSG_DOWNLOAD_FAIL 下载成功返回 MSG_LEAVEMSG_DOWNLOAD_SUCCESS |
版本 | 3.2 |
说明 | 获取语音留言数据 |
示例 |
6.8 SD卡操作
6.8.2 获取存储介质状态
名称 | List<EZStorageStatus> getStorageStatus(String deviceSerial) |
---|---|
参数 | @param deviceSerial 需要获取的设备序列号 |
返回值 | @return 存储状态(EZStorageStatus)列表,列表每个item代表一个磁盘分区 @throws BaseException |
版本 | 3.2 |
说明 | 格式化分区(SD卡) |
示例 |
6.8.3 格式化分区(SD卡)
名称 | boolean formatStorage(String deviceSerial, int partitionIndex) |
---|---|
参数 | @param deviceSerial 需要格式化的设备序列号 @param partitionIndex 查询返回的分区号 |
返回值 | @return true 表示成功, false 表示失败 @throws BaseException |
版本 | 3.2 |
说明 | 格式化分区(SD卡) |
示例 |
6.9 录像相关模块
6.9.2 搜索云存储录像
名称 | List<EZCloudRecordFile> searchRecordFileFromCloud(String cameraID,Calendar startTime, Calendar endTime) throws BaseException |
---|---|
参数 | @param cameraID 设备摄像头id @param startTime 查询时间范围开始时间 @param endTime 查询时间范围结束时间 |
返回值 | @return 云存储录像信息列表 @throws BaseException |
版本 | 3.0 |
说明 | 查询云存储录像信息列表 |
示例 |
6.9.3 搜索SD卡录像
名称 | List<EZDeviceRecordFile> searchRecordFileFromDevice(String cameraID, Calendar startTime, Calendar endTime) throws BaseException |
---|---|
参数 | @param cameraID 设备摄像头id @param startTime 查询时间范围开始时间 @param endTime 查询时间范围结束时间 |
返回值 | @return 远程SD卡存储录像信息列表 @throws BaseException |
版本 | 3.0 |
说明 | 查询远程SD卡存储录像信息列表 |
示例 |
6.10 设备控制模块
接口说明:该接口的主要功能是云台控制和镜头显示功能,属于限制级接口,要优选通过判断设备的能力集来调用,设备能力集请查看EZDeviceInfo对象的属性值来判断
6.10.2 controlPTZ
名称 | int controlPTZ(String cameraId, EZPTZCommand command, EZPTZAction action, int speed) |
---|---|
参数 | @param cameraId 设备摄像头id @param command ptz控制命令 @param action 控制启动/停止 @param speed 速度(0-7) |
返回值 | @return 操作成功或者失败(返回失败错误码) |
版本 | 3.0 |
说明 | PTZ 控制接口,目前支持 EZPTZCommandLeft, // 向左旋转 EZPTZCommandRight, // 向右旋转 EZPTZCommandUp, // 向上旋转 EZPTZCommandDown; // 向下旋转 |
示例 |
6.10.3 controlDisplay
名称 | int controlDisplay(String cameraId, EZPTZDisplayCommand command) |
---|---|
参数 | @param cameraId 设备摄像头id @param command 显示控制命令, 目前只支持EZPTZCommandFlip |
返回值 | @return 操作成功或者失败(返回失败错误码) |
版本 | 3.0 |
说明 | 摄像头显示控制接口(根据能力集处理) 目前只支持EZPTZCommandFlip,即图像翻转 |
示例 |
6.11 EZPlayer模块
6.11.2 预览流程
参数cameraId是摄像头ID,获取摄像头列表接口获得的数据
获得设备能力 后可通过调用以下函数获取设备一些能力信息:
videoLevel:当前清晰度等级2-高清,1-标清,0-流畅
成功消息:MSG_REALPLAY_PLAY_SUCCESS
失败消息:MSG_REALPLAY_PLAY_FAIL
6.11.3 回放流程
6.11.4 createPlayer
名称 | EZPlayer createPlayer(Context context, final String cameraId) |
---|---|
参数 | @param context activity上下文context @param camera_id 摄像头Id |
返回值 | @return EZPlayer对象 |
版本 | 3.0 |
说明 | 根据cameraId构造EZPlayer对象 |
示例 |
6.11.5 createPlayerWithUrl
名称 | EZPlayer createPlayerWithUrl(Context context, final String url) |
---|---|
参数 | @param context activity上下文context @param url 视频url |
返回值 | @return EZPlayer对象 |
版本 | 3.0 |
说明 | 根据url构造EZPlayer对象 (主要用来处理url视频的播放 |
示例 |
6.11.6 releasePlayer
名称 | void releasePlayer(EZPlayer player) |
---|---|
参数 | @param player 将要释放的EZPlayer对象 |
返回值 | void |
版本 | 3.0 |
说明 | 释放 EZPlayer 对象 |
示例 |
6.11.7 setSurfaceHolder
名称 | boolean setSurfaceHolder(SurfaceHolder sh) |
---|---|
参数 | @param sh 用于播放的Surface |
返回值 | @return true 表示成功, false 表示失败 |
说明 | 设置播放器的显示Surface |
版本 | 3.0 |
示例 |
6.11.8 setHandler
名称 | boolean setHandler(Handler handler) |
---|---|
参数 | @param handler 处理消息的Handler |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 设置Handler, 该handler将被用于从播放器向handler传递消息 |
示例 |
6.11.9 startRealPlay
名称 | boolean startRealPlay() |
---|---|
参数 | |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 开始实时预览 注意:如果视频是加密的,sdk会弹出密码对话框 消息通过setHandler()中设置的handler发送 成功消息:MSG_REALPLAY_PLAY_SUCCESS 失败消息:MSG_REALPLAY_PLAY_FAIL |
示例 |
6.11.10 stopRealPlay
名称 | boolean stopRealPlay() |
---|---|
参数 | |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 结束实时预览 |
示例 |
6.11.11 setVideoLevel
名称 | boolean setVideoLevel(EZVideoLevel videoLevel) |
---|---|
参数 | @param videoLevel 清晰度模式: VIDEO_LEVEL_HD 高清 VIDEO_LEVEL_BALANCED 标清 VIDEO_LEVEL_FLUNET 流畅 |
返回值 | @return true 表示成功, false 表示失败 @throws BaseException |
版本 | 3.0 |
说明 | 清晰度设置 |
示例 |
6.11.12 capturePicture
名称 | Bitmap capturePicture() |
---|---|
参数 | |
返回值 | Bitmap 返回截获的Bitmap对象 |
版本 | 3.0 |
说明 | 开启截屏,获取摄像头实时图片的url,需要设备支持,萤石设备一般都能支持此协议。(该功能和萤石云视频app首页刷新封面的功能一致) 耗时操作,最好放到单独线程中 |
示例 | 以下代码将capturePicture返回的bitmap对象保存到文件 |
Thread thr = new Thread() {
@Override
public void run() {
Bitmap bmp = mEZMediaPlayer.capturePicture();
FileOutputStream fos = null;
if(bmp != null) {
try {
fos = new FileOutputStream("/sdcard/video_snapshots.jpg");
bmp.compress(CompressFormat.JPEG, 100, fos);
bmp.recycle();
bmp = null;
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if(fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
super.run();
}};
thr.start();
6.11.13 openSound
名称 | boolean openSound() |
---|---|
参数 | |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 开启声音 注意:开关声音只在开始播放以后有效。 |
示例 |
6.11.14 closeSound
名称 | boolean closeSound() |
---|---|
参数 | |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 关闭声音 注意:开关声音只在开始播放以后有效 startVoiceTalk以后必须调用stopVoiceTalk,保证方法的成对出现,否则容易出现问题 |
示例 |
6.11.15 getOSDTime
名称 | Calendar getOSDTime() |
---|---|
参数 | |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 获取当前播放时间进度 |
示例 |
6.11.16 startVoiceTalk
名称 | boolean startVoiceTalk() |
---|---|
参数 | |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 开始对讲 |
示例 |
6.11.17 stopVoiceTalk
名称 | boolean stopVoiceTalk() |
---|---|
参数 | |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 停止对讲 |
示例 |
6.11.18 setVoiceTalkStatus
名称 | setVoiceTalkStatus(boolean pressed) |
---|---|
参数 | @param pressed |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | |
示例 |
6.11.19 startLocalRecordWithFile
名称 | boolean startLocalRecordWithFile(String fileName) |
---|---|
参数 | fileName 录像文件名,在app层创建 |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 开始本地直播流录像功能。 |
示例 |
6.11.20 stopLocalRecord
名称 | boolean stopLocalRecord() |
---|---|
参数 | |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 结束本地直播流录像 |
示例 |
6.11.21 startPlayback
名称 | boolean startPlayback(EZCloudFile cloudFile,String startTime) |
---|---|
参数 | @param cloudFile 云存储文件信息。@param startTime |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 开始云存储远程回放 |
示例 |
6.11.22 startPlayback
名称 | boolean startPlayback(EZCloudFile cloudFile,String startTime) |
---|---|
参数 | @param deviceFile SD卡文件信息。@param startTime |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 开始远程SD卡回放 |
示例 |
6.11.23 stopPlayback
名称 | boolean stopPlayback() |
---|---|
参数 | |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 停止远程回放 |
示例 |
6.11.24 pausePlayback
名称 | boolean pausePlayback() |
---|---|
参数 | |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 暂停远程回放播放 |
示例 |
6.11.25 resumePlayback
名称 | boolean resumePlayback() |
---|---|
参数 | |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 继续远程回放播放 |
示例 |
6.11.26 setDisplayRegion
名称 | setDisplayRegion(boolean enable,CustomRect original,CustomRect current) |
---|---|
参数 | |
返回值 | @return true 表示成功, false 表示失败 |
版本 | 3.0 |
说明 | 设置电子放大区域 |
示例 |
6.12 安全验证接口
6.12.2 获取验证短信
名称 | boolean getSmsCode(EZSMSType type) throws BaseException |
---|---|
参数 | @param type 要获取的短信验证码类型,默认为EZSMSTypeSecure(安全验证) |
返回值 | @return true 表示成功, false 表示失败 @throws BaseException |
版本 | 3.1 |
说明 | 获取验证短信 |
示例 |
6.12.4 验证安全短信
名称 | boolean validateSecureSMSCode (String smsCode) throws BaseException |
---|---|
参数 | @param smsCode 短信验证码 |
返回值 | @return true 表示成功, false 表示失败 @throws BaseException |
版本 | 3.2 |
说明 | 验证安全短信验证 |
示例 |
6.12.5 向SDK设置验证码
名称 | setValidateCode(String validateCode, String deviceSerial) |
---|---|
参数 | @param validateCode 验证码 @param deviceSerial 设备序列号 |
返回值 | @return true 表示成功, false 表示失败 @throws BaseException |
版本 | 3.1 |
说明 | 向SDK设置验证码 |
示例 |
6.12.6 向SDK获取验证码
名称 | String getValidateCode(String deviceSerial) |
---|---|
参数 | @param deviceSerial 设备序列号 |
返回值 | @return 验证码 |
版本 | 3.1 |
说明 | 向SDK获取验证码 |
示例 |
6.12.7 解密数据
名称 | byte[] decryptData(byte[] inputData, String password) |
---|---|
参数 | @param data 欲解密的数据 @param password 密码 |
返回值 | @return 解密后的数据 |
版本 | 3.1 |
说明 | 用于解密数据。 比方说如果设备是加密的,则告警图片也是加密的,这时可以用这个函数将数据揭秘。 |
示例 | 测试如何解密数据 |
private void test_decryptData() {
// url是加密后的告警图片url, EZAlarmInfo.alarmPicUrl
String url = "https://i.ys7.com/streamer/alarm/url/get?fileId=562bf00c-daec-11e5-8000-e02ec7d605d5&deviceSerialNo=497413200&isEncrypted=1&isCloudStored=1";
RestfulUtils restfulUtils = RestfulUtils.getInstance();
{
//1, 下载数据,可能需要自己实现, 我这里调用的是postForStream
// InputStream is = restfulUtils.postForStream(null, url);
InputStream is = null;//restfulUtils.postForStream(null, url);
try {
byte data[] = new byte[500 * 1024];
int len = 0, size = 0;
while (size != -1) {
size = is.read(data, len, data.length - len);
if (size != -1)
len += size;
}
byte pureContent[] = Arrays.copyOf(data, len);
// 2, 调用decryptData得到解密后的bitmap数据, NXXJOO为密码(默认是设备验证码)
byte[] decryptData = EZOpenSDK.getInstance().decryptData(pureContent, "NXXJOO");
LogUtil.i(TAG, "test_decryptData: decrypt finish");
// 3, 将解密后的数据写到文件中,看是否解密成功
// FileOutputStream fos2 = new FileOutputStream(new File("/sdcard/decrypt_img.jpg"));
// LogUtil.i(TAG, "test_decryptData: fos2 created");
// Bitmap bmp = BitmapFactory.decodeByteArray(decryptData, 0, decryptData.length);
// LogUtil.i(TAG, "test_decryptData: bitmap created");
// bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos2);
// LogUtil.i(TAG, "test_decryptData:compressed to file");
} catch (IOException e) {
e.printStackTrace();
}
}
}
6.13 实体类
6.13.2 EZCameraInfo
Key | Type | 备注 |
---|---|---|
cameraId | String | 摄像头ID |
cameraName | String | 摄像头名称 |
channelNo | String | 通道号 |
deviceSerial | String | 设备序列号 |
isEncrypt | boolean | 设备是否加密 |
isShared | boolean | 是否是分享设备 |
picUrl | String | 设备PC端设备的封面地址 |
isOnline | boolean | 是否在线 |
6.13.3 EZDeviceInfo
Key | Type | 备注 |
---|---|---|
deviceSerial | String | 设备序列号 |
isSupportDefence | boolean | 是否支持布撤防 |
isSupportDefencePlan | boolean | 是否支持布撤防计划 |
isSupportTalk | boolean | 是否支持对讲 |
isSupportPTZ | boolean | 是否支持云台控制 |
isSupportZoom | boolean | 是否支持放大 |
isSupportUpgrade | boolean | 是否支持升级 |
6.13.4 EZAlarmInfo
Key | Type | 备注 |
---|---|---|
alarmId | String | 告警ID |
alarmName | String | 告警名称 |
alarmPicUrl | String | 告警图片 |
alarmStartTime | Calendar | 告警开始时间 |
alarmType | Int | 告警类型 |
6.13.5 EZCloudRecordFile
Key | Type | 备注 |
---|---|---|
fileId | String | 云存储录像文件ID |
startTime | Calendar | 云存储录像文件开始时间 |
stopTime | Calendar | 云存储录像文件结束时间 |
coverPic | String | 云存储录像截图地址 |
downloadPath | String | 云存储录像下载地址 |
6.13.6 EZDeviceRecordFile
Key | Type | 备注 |
---|---|---|
StartTime | Calendar | 远程SD卡录像文件开始时间 |
StopTime | Calendar | 远程SD卡录像文件结束时间 |
6.14 EZOpenSDK枚举值
6.14.2 EZOpenSDKError
Key | 备注 |
---|---|
EZ_DEVICE_OFFLINE | 设备不在线 |
EZ_PLAY_TIMEOUT | 网络连接超时 |
EZ_DEVICE_TIMEOUT | 设备端网络连接超时 |
EZ_DEVICE_CONNECT_COUNT_LARGEST | 设备取流连接数量超过最大值 |
EZ_DEVICE_QUERY_RECORD_FAILED | 远程SD卡搜索录像失败 |
EZ_DEVICE_TTS_TALKING | 设备正在对讲中 |
EZ_DEVICE_CAS_TALKING | 设备正在对讲中 |
EZ_DEVICE_IS_PRIVACY_PROTECTING | 设备隐私保护中 |
EZ_DEVICE_BUNDEL_STATUS_ON | 设备开启了终端绑定,未绑定客户端无法取流 |
EZ_DEVICE_COMMAND_NOT_SUPPORT | 设备不支持该命令 |
6.14.3 EZPlayerError
详见EZConstants.java
6.14.4 WiFi配置设备状态
6.14.5 其他
详见 EZConstants.java
6.14.6 其他说明
设备序列号与验证码(如图所示,位于摄像头机身):
WiFi配置界面流程:
6.14.7 错误代码说明及分析
在demo目录下有个文件《Android开放平台错误码.xlsx》,里面有比较详细的错误码说明。ErrorCode.java也有错误定义,可作为参考
以下供开发者参考:
Key | 备注 |
---|---|
10002 | ERROR_WEB_SESSION_ERROR access_tocken异常 开发者在调用网络或者播放接口遇到该错误码时,可以尝试重新登陆或者设置正确的accessToken |
10000 | ERROR_WEB_NETWORK_EXCEPTION 网络异常 这是一个比较笼统的错误,非其他错误,并且调用网络接口得到该错误码时,一般可以检查以下情况: 1)从平台得到的结果字符串可能是错的,或者是空,都可能导致抛出该异常,此时应通过log日志定位排查 2)其他比较笼统的网络问题,如IO问题 |
349999 | 视频预览时,349999表示超时15s没有来流,可能是网络状况不好 |
400901 | ErrorCode.ERROR_TRANSF_DEVICE_OFFLINE 设备不在线 |
400902 | ErrorCode.ERROR_TRANSF_ACCESSTOKEN_ERROR AccessToken,如已失效或过期,需要重新获取AccessToken(如重新调用OpenLoginPage接口) |
400903 | ErrorCode.ERROR_TRANSF_TERMINAL_BINDING 当前账号开启了终端绑定,只允许指定设备登录操作,请参考此步骤解除终端绑定方法解除终端绑定 |
400034 | ErrorCode.ERROR_INNER_STREAM_TIMEOUT 视频预览或回放时,此错误表示超时15s没有来流,可能是网络状况不好 |
395405 | ErrorCode.ERROR_STREAM_VTDU_STATUS_405 服务器和设备间的信令交互超时,一般为设备端的网络状况不良导致 |
其他错误请参考ErrorCode类。