1. 萤石云视频Android SDK接口使用说明

2. 1. 简介

本文档用于说明萤石开放平台SDK Android版本接口之间的关系以及接口调用顺序,对开放平台SDK Android版本各接口都有详细的说明。主要分为四个部分,第一部分为名词解释;第二部分为SDK环境配置;第三部阐述了开放SDK的主要调用流程;第四部分对各模块接口进行了详细的说明。

3. 2. 名词解释

名词 释义
accessToken 访问令牌,由server返回给client用于认证
cameraId 摄像头唯一标志
AppKey 应用程序key
AppKey的申请可以参阅: https://open.ys7.com/view/app/app_edit.html
deviceSerial 设备唯一标志
OSD 视频当前时间
PTZ 云台控制,可以通过终端控制操作设备

4. 3. 功能介绍

V3.0: 账号对接(授权登录、sdk接口登录)、获取摄像头列表、直播预览、查看回放(SD卡、云存储)、设备添加删除、设备的设置功能(h5)、设备控制接口(云台、镜头画面)、WiFi配置、视频本地录像、视频截屏、告警消息等。

V3.1: 安全验证接口、获取设置设备验证码、数据解密接口等,主要功能是完成UI版本的开源项目。

5. 4. SDK配置

1、新建android app工程

2、导入EZOpenSDK.jar(拷贝到libs/下)

3、拷贝lib*.so到libs/armeabi/

图1

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>

6. 5. 快速接入示范

本节旨在引导开发者进行快速接入,通过介绍几个关键的接口,并给出对应的界面和接口,以及代码范例,让开发者对sdk有个初步了解. 首先请下载并安装萤石云app, 登陆以后,进入的是监控列表界面,如下所示 [图中橙色矩形框仅作为标注,并非原生app界面]。

6.1.1. 5.1 获取摄像头列表

APP 我的设备

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

6.1.2. 5.2 添加设备

APP 加设备 APP 二维码扫描

APP 手动输入序列号

说明:需要添加设备时,可以点击界面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 设备不在线,已经被自己添加 (给出提示)

至此,一个简单的设备添加就完成了。

6.1.3. 5.3 Wifi一键配置

在上述调用接口probeDeviceInfo过程中,如果返回的错误码是20023,说明设备还没有联网,这时需要让设备联网,如果是有线设备,需要提示用户插入网线。如果是无线设备,则需要进行wifi配置。

APP configWifi APP configWifi 第一步

APP configWifi 第二步 APP configWifi 第三步 1

APP configWifi 第三步 2 APP configWifi 第三步 3

APP configWifi 第三步 4

开始一键配置需要调用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进行添加

6.1.4. 5.4 设备预览

inithhhggggg

预览视频的代码参见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

7. 6. 接口

7.1.1. 6.1 SDK整体接入流程

flowchart

  1. 用户使用SDK初始化后的第一步通过账号对接流程(参考http://service.ys7.com/question/answer.html?id=21222&user_type=0&selected_type=热门问题考) 获取accessToken的对象
  2. 通过EZOpenSDK的setAccessToken方法向SDK设置AccessToken;
  3. 然后可以通过设备列表接口获取设备信息;
  4. 针对设备预览、回放、设备操作(云台控制、设备显示设置)、查看告警列表等功能接口调用;
  5. 预览成功以后才能抓图、录像、开关声音;
  6. 语音对讲操作;
  7. 回放成功以后才能抓图、录像、开关声音;
  8. WiFi配置之前要先通过设备序列号查询设备是否添加过。

注意: 开发者调用的主要接口都在EZOpenSDK.java 和 EZPlayer.java这2个类中

7.1.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

7.1.3. 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.

7.1.4. 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

7.1.5. 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
说明 开通萤石服务
示例

7.1.6. 6.3.2 setAccessToken

名称 void setAccessToken(String accessToken)
参数 String accessToken
返回值 3.0
说明 授权登录以后给EZOpenSDK设置AccessToken
示例

7.1.7. 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();

7.1.8. 6.3.4 登出

名称 void logout()
参数
返回值 void
版本 3.0
说明 登出账号
示例

7.1.9. 6.3.5 获取用户信息

名称 EZUserInfo getUserInfo()
参数
返回值 @return 返回 EZUserInfo 对象
@throws BaseException@throws BaseException
版本 3.2
说明 获取用户信息;用户信息包含:用户名,头像地址等
示例

7.1.10. 6.3.6 修改密码页面

名称 void openChangePasswordPage()
参数
返回值
版本 3.3
说明 可以通过该页面修改密码
示例

7.1.11. 6.4 设备模块

接口说明:

  1. 通过获取摄像头列表的接口(支持分页),你可以从萤石云服务器获取当前登录账号的设备列表,你可以根把返回的EZCameraInfo的数组在你的UI展示设备,然后你可以通过cameraId进行预览、设备云存储录像或者SD卡录像列表获取等操作;
  2. 通过deviceSerial对摄像头列表中的设备进行删除操作、中间页面设置设备;
  3. 添加设备时,先调用getCameraInfo获取摄像头信息,该函数返回值(见函数详细说明 )会提示摄像头是否已经添加。
    a) 如果该摄像头已经被添加,则添加流程中止,此时开发者应该提示用户已添加
    b) 如果摄像头未被添加,则调用无线配置wifiConfig, 并进一步通过addDevice来添加 无线设备的添加,demo中有具体的例子。

对于有线设备的添加,添加过程跟无线是一样的,先调getCameraInfo查询信息,如果设备没有被添加,则继续调用addDevice添加。只不过没有wifi配置这一步。

7.1.12. 6.4.2 WiFi一键配置流程

configWifi flowchart

特别说明: 账户下删除设备重新wifi配置并且添加过程中,请在重置设备等待2分钟以后再调用wifi配置的相关接口可以提高wifi配置的成功率,否则会降低成功率,因为重置设备以后我们平台将在2分钟内得到设备下线的状态,只有平台认为下线了,wifi配置成功率才会高。

7.1.13. 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
示例

7.1.14. 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:不在线未添加,继续走添加流程。
示例

7.1.15. 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
说明 删除当前账号的设备
示例

7.1.16. 6.4.6 openSettingDevicePage

名称 void openSettingDevicePage(String deviceSerial)
参数 @param deviceSerial设备标志(列表接口返回的deviceSerial)
返回值 void
版本 3.0
说明 打开设备设置中间页
示例

7.1.17. 6.4.7 添加设备

名称 boolean addDevice(String deviceSerial, String deviceCode) throws BaseException
参数 @param deviceSerial 设备序列号
@param deviceCode 设备验证码
返回值 @return true 表示成功, false 表示失败
@throws BaseException
版本 3.0
说明 添加设备
示例

7.1.18. 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配置
示例

7.1.19. 6.4.9 stopConfigWiFi

名称 boolean stopConfigWiFi()
参数
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 停止Wifi配置
示例

7.1.20. 6.4.10 尝试查询设备信息

名称 EZProbeDeviceInfo probeDeviceInfo(String deviceSerial)
参数 @param deviceSerial 需要查询的设备序列号
返回值 @return 返回 EZProbeDeviceInfo 对象,包含设备简单信息,用于添加目的
@throws BaseException
版本 3.2
说明 尝试查询设备信息(用于添加设备之前, 简单查询设备信息,如是否在线,是否添加等)
示例

7.1.21. 6.4.11 开启布防(活动检测)

名称 boolean setDefence(boolean isDefence,String deviceSerial)
参数
返回值 @return true 表示成功, false 表示失败
@throws BaseException
版本 3.2
说明 根据设备序列号控制设备的活动检测开关接口
示例

7.1.22. 6.4.12 抓取摄像头图片

名称 String getRealPicture(String deviceSerial,int channelNo)
参数 @param deviceSerial 设备序列号
@param channelNo 通道号
返回值 @return 图片url
@throws BaseException
版本 3.2
说明 获取抓取摄像头图片的url
示例

7.1.23. 6.4.13 获取设备的版本信息

名称 EZDeviceVersion getDeviceVersion(String deviceSerial)
参数 @param deviceSerial 设备序列号
返回值 @return 版本号EZDeviceVersion对象
@throws BaseException
版本 3.2
说明 获取设备的版本信息
示例

7.1.24. 6.4.14 设置摄像机视频是否加密

名称 boolean setDeviceEncryptStatusEx(boolean isEncrypt, String deviceSerial, String validateCode)
参数 @param isEncrypt 是否加密
@param deviceSerial 设备序列号
@param validateCode 设备验证码,位于设备机身标签上
返回值 @return true 表示成功, false 表示失败
@throws BaseException
版本 3.4
说明 视频是否加密开关接口
示例

7.1.25. 6.4.15 修改设备名称

名称 boolean setDeviceName(String deviceSerial, String deviceName)
参数 @param deviceSerial 设备序列号
@param deviceName 设备名称
返回值 @return true 表示成功, false 表示失败
@throws BaseException
版本 3.2
说明 修改设备名称接口
示例

7.1.26. 6.4.16 通过序列号获取设备信息

名称 EZDeviceInfo getDeviceInfoBySerial(String deviceSerial)
参数 @param deviceSerial 设备序列号
返回值 @return 设备信息
@throws BaseException
版本 3.2
说明 获取设备详细信息
示例

7.1.27. 6.4.17 打开云存储页面

名称 void openCloudPage(String deviceSerial)
参数 @param deviceSerial 设备序列号
返回值 @throws BaseException
版本 3.2
说明 打开云存储页面
示例

7.1.28. 6.4.18 获取设备列表

名称 List <EZDeviceInfo> getDeviceList(int pageIndex, int pageSize)
参数 @param pageIndex 分页起始页,从0开始
@param pageSize 分页每页数量(建议20以内)
返回值 @return 设备列表
@throws BaseException
版本 3.3
说明 获取用户的设备列表,返回EZDeviceInfo的对象数组
示例

7.1.29. 6.4.19 根据序列号获取探测器列表

名称 List<EZDetectorInfo> getDetectorList(String deviceSerial)
参数 @param deviceSerial 设备序列号
返回值 @return 探测器列表
@throws BaseException
版本 3.3
说明 根据设备序列号获取设备关联的探测器列表
示例

7.1.30. 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设备的布防
示例

7.1.31. 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时查询整个账户下的告警信息列表
示例

7.1.32. 6.5 设备升级

7.1.33. 6.5.2 获取设备升级状态

名称 EZDeviceUpgradeStatus getDeviceUpgradeStatus(String deviceSerial)
参数 @param deviceSerial 设备序列号
返回值 @return EZDeviceUpgradeStatus 返回升级状态,包含升级进度等
@throws BaseException
版本 3.2
说明 获取设备升级状态
示例

7.1.34. 6.5.3 开始升级设备

名称 void upgradeDevice(String deviceSerial)
参数 @param deviceSerial 设备序列号
返回值 @throws BaseException
版本 3.2
说明 开始升级设备
示例

7.1.35. 6.6 告警信息模块

7.1.36. 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
说明 获取指定设备的告警信息列表
示例

7.1.37. 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
说明 设置告警状态
示例

7.1.38. 6.6.4 删除告警信息

名称 boolean deleteAlarm(List<String> alarmIdList) throws BaseException
参数 @param alarmIdList 告警list
返回值 @return true 表示成功, false 表示失败
@throws BaseException
版本 3.0
说明 批量删除告警
示例

7.1.39. 6.7 留言消息模块

7.1.40. 6.7.2 获取未读消息数

名称 int getUnreadMessageCount(String deviceSerial,EZMessageType messageType)
参数 @param deviceSerial 需要获取的设备序列号,为空时返回账户下所有设备的未读消息数
@param messageType 消息类型:
EZMessageTypeAlarm 告警消息,EZMessageTypeLeave 留言消息
返回值 @return 未读消息数
@throws BaseException
版本 3.2
说明 获取未读消息数
示例

7.1.41. 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
说明 获取留言消息列表
示例

7.1.42. 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
说明 批量设置留言消息已读功能
示例

7.1.43. 6.7.5 批量删除留言消息

名称 boolean deleteLeaveMessages(List<String> msgIdList)
参数 @param msgIdList 留言消息Id数组(最大数量为10,允许只有1个),多个ID以半角逗号隔开,如:1234565,124344
返回值 @return true 表示成功, false 表示失败
@throws BaseException
版本 3.2
说明 批量删除留言消息
示例

7.1.44. 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
说明 获取语音留言数据
示例

7.1.45. 6.8 SD卡操作

7.1.46. 6.8.2 获取存储介质状态

名称 List<EZStorageStatus> getStorageStatus(String deviceSerial)
参数 @param deviceSerial 需要获取的设备序列号
返回值 @return 存储状态(EZStorageStatus)列表,列表每个item代表一个磁盘分区
@throws BaseException
版本 3.2
说明 格式化分区(SD卡)
示例

7.1.47. 6.8.3 格式化分区(SD卡)

名称 boolean formatStorage(String deviceSerial, int partitionIndex)
参数 @param deviceSerial 需要格式化的设备序列号
@param partitionIndex 查询返回的分区号
返回值 @return true 表示成功, false 表示失败
@throws BaseException
版本 3.2
说明 格式化分区(SD卡)
示例

7.1.48. 6.9 录像相关模块

7.1.49. 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
说明 查询云存储录像信息列表
示例

7.1.50. 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卡存储录像信息列表
示例

7.1.51. 6.10 设备控制模块

接口说明:该接口的主要功能是云台控制和镜头显示功能,属于限制级接口,要优选通过判断设备的能力集来调用,设备能力集请查看EZDeviceInfo对象的属性值来判断

7.1.52. 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; // 向下旋转
示例

7.1.53. 6.10.3 controlDisplay

名称 int controlDisplay(String cameraId, EZPTZDisplayCommand command)
参数 @param cameraId 设备摄像头id
@param command 显示控制命令, 目前只支持EZPTZCommandFlip
返回值 @return 操作成功或者失败(返回失败错误码)
版本 3.0
说明 摄像头显示控制接口(根据能力集处理)
目前只支持EZPTZCommandFlip,即图像翻转
示例

7.1.54. 6.11 EZPlayer模块

7.1.55. 6.11.2 预览流程

预览流程

参数cameraId是摄像头ID,获取摄像头列表接口获得的数据

获得设备能力 后可通过调用以下函数获取设备一些能力信息:
videoLevel:当前清晰度等级2-高清,1-标清,0-流畅

成功消息:MSG_REALPLAY_PLAY_SUCCESS
失败消息:MSG_REALPLAY_PLAY_FAIL

7.1.56. 6.11.3 回放流程

回放流程

7.1.57. 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对象
示例

7.1.58. 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视频的播放
示例

7.1.59. 6.11.6 releasePlayer

名称 void releasePlayer(EZPlayer player)
参数 @param player 将要释放的EZPlayer对象
返回值 void
版本 3.0
说明 释放 EZPlayer 对象
示例

7.1.60. 6.11.7 setSurfaceHolder

名称 boolean setSurfaceHolder(SurfaceHolder sh)
参数 @param sh 用于播放的Surface
返回值 @return true 表示成功, false 表示失败
说明 设置播放器的显示Surface
版本 3.0
示例

7.1.61. 6.11.8 setHandler

名称 boolean setHandler(Handler handler)
参数 @param handler 处理消息的Handler
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 设置Handler, 该handler将被用于从播放器向handler传递消息
示例

7.1.62. 6.11.9 startRealPlay

名称 boolean startRealPlay()
参数
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 开始实时预览
注意:如果视频是加密的,sdk会弹出密码对话框
消息通过setHandler()中设置的handler发送
成功消息:MSG_REALPLAY_PLAY_SUCCESS
失败消息:MSG_REALPLAY_PLAY_FAIL
示例

7.1.63. 6.11.10 stopRealPlay

名称 boolean stopRealPlay()
参数
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 结束实时预览
示例

7.1.64. 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
说明 清晰度设置
示例

7.1.65. 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();

7.1.66. 6.11.13 openSound

名称 boolean openSound()
参数
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 开启声音
注意:开关声音只在开始播放以后有效。
示例

7.1.67. 6.11.14 closeSound

名称 boolean closeSound()
参数
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 关闭声音
注意:开关声音只在开始播放以后有效
startVoiceTalk以后必须调用stopVoiceTalk,保证方法的成对出现,否则容易出现问题
示例

7.1.68. 6.11.15 getOSDTime

名称 Calendar getOSDTime()
参数
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 获取当前播放时间进度
示例

7.1.69. 6.11.16 startVoiceTalk

名称 boolean startVoiceTalk()
参数
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 开始对讲
示例

7.1.70. 6.11.17 stopVoiceTalk

名称 boolean stopVoiceTalk()
参数
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 停止对讲
示例

7.1.71. 6.11.18 setVoiceTalkStatus

名称 setVoiceTalkStatus(boolean pressed)
参数 @param pressed
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明
示例

7.1.72. 6.11.19 startLocalRecordWithFile

名称 boolean startLocalRecordWithFile(String fileName)
参数 fileName 录像文件名,在app层创建
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 开始本地直播流录像功能。
示例

7.1.73. 6.11.20 stopLocalRecord

名称 boolean stopLocalRecord()
参数
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 结束本地直播流录像
示例

7.1.74. 6.11.21 startPlayback

名称 boolean startPlayback(EZCloudFile cloudFile,String startTime)
参数 @param cloudFile 云存储文件信息。@param startTime
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 开始云存储远程回放
示例

7.1.75. 6.11.22 startPlayback

名称 boolean startPlayback(EZCloudFile cloudFile,String startTime)
参数 @param deviceFile SD卡文件信息。@param startTime
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 开始远程SD卡回放
示例

7.1.76. 6.11.23 stopPlayback

名称 boolean stopPlayback()
参数
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 停止远程回放
示例

7.1.77. 6.11.24 pausePlayback

名称 boolean pausePlayback()
参数
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 暂停远程回放播放
示例

7.1.78. 6.11.25 resumePlayback

名称 boolean resumePlayback()
参数
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 继续远程回放播放
示例

7.1.79. 6.11.26 setDisplayRegion

名称 setDisplayRegion(boolean enable,CustomRect original,CustomRect current)
参数
返回值 @return true 表示成功, false 表示失败
版本 3.0
说明 设置电子放大区域
示例

7.1.80. 6.12 安全验证接口

7.1.81. 6.12.2 获取验证短信

名称 boolean getSmsCode(EZSMSType type) throws BaseException
参数 @param type 要获取的短信验证码类型,默认为EZSMSTypeSecure(安全验证)
返回值 @return true 表示成功, false 表示失败
@throws BaseException
版本 3.1
说明 获取验证短信
示例

7.1.82. 6.12.4 验证安全短信

名称 boolean validateSecureSMSCode (String smsCode) throws BaseException
参数 @param smsCode 短信验证码
返回值 @return true 表示成功, false 表示失败
@throws BaseException
版本 3.2
说明 验证安全短信验证
示例

7.1.83. 6.12.5 向SDK设置验证码

名称 setValidateCode(String validateCode, String deviceSerial)
参数 @param validateCode 验证码
@param deviceSerial 设备序列号
返回值 @return true 表示成功, false 表示失败
@throws BaseException
版本 3.1
说明 向SDK设置验证码
示例

7.1.84. 6.12.6 向SDK获取验证码

名称 String getValidateCode(String deviceSerial)
参数 @param deviceSerial 设备序列号
返回值 @return 验证码
版本 3.1
说明 向SDK获取验证码
示例

7.1.85. 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();
        }
    }
}

7.1.86. 6.13 实体类

7.1.87. 6.13.2 EZCameraInfo

Key Type 备注
cameraId String 摄像头ID
cameraName String 摄像头名称
channelNo String 通道号
deviceSerial String 设备序列号
isEncrypt boolean 设备是否加密
isShared boolean 是否是分享设备
picUrl String 设备PC端设备的封面地址
isOnline boolean 是否在线

7.1.88. 6.13.3 EZDeviceInfo

Key Type 备注
deviceSerial String 设备序列号
isSupportDefence boolean 是否支持布撤防
isSupportDefencePlan boolean 是否支持布撤防计划
isSupportTalk boolean 是否支持对讲
isSupportPTZ boolean 是否支持云台控制
isSupportZoom boolean 是否支持放大
isSupportUpgrade boolean 是否支持升级

7.1.89. 6.13.4 EZAlarmInfo

Key Type 备注
alarmId String 告警ID
alarmName String 告警名称
alarmPicUrl String 告警图片
alarmStartTime Calendar 告警开始时间
alarmType Int 告警类型

7.1.90. 6.13.5 EZCloudRecordFile

Key Type 备注
fileId String 云存储录像文件ID
startTime Calendar 云存储录像文件开始时间
stopTime Calendar 云存储录像文件结束时间
coverPic String 云存储录像截图地址
downloadPath String 云存储录像下载地址

7.1.91. 6.13.6 EZDeviceRecordFile

Key Type 备注
StartTime Calendar 远程SD卡录像文件开始时间
StopTime Calendar 远程SD卡录像文件结束时间

7.1.92. 6.14 EZOpenSDK枚举值

7.1.93. 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 设备不支持该命令

7.1.94. 6.14.3 EZPlayerError

详见EZConstants.java

7.1.95. 6.14.4 WiFi配置设备状态

7.1.96. 6.14.5 其他

详见 EZConstants.java

7.1.97. 6.14.6 其他说明

设备序列号与验证码(如图所示,位于摄像头机身):

序列号与验证码

WiFi配置界面流程:

APP WiFi配置界面流程 1 APP WiFi配置界面流程 2 APP WiFi配置界面流程 3

7.1.98. 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类。

results matching ""

    No results matching ""