Skip to content

千里眼OpenSDK 安卓使用说明

一、工程配置

1、工程下新建文件夹:如LocalRepo,将QlyOpenSDK_v1.0.0.aar复制到LocalRepo下qlysdk目录下,新建build.gradle文件,把以下两行代码复制到build.gradle文件中:

configurations.maybeCreate("default")
artifacts.add("default", file('QlyOpenSDK_v1.0.0.aar'))

如图:

2、 工程项目的settings.gradle文件中添加:

include ':LocalRepo:qlysdk'

如图:

3、将千里眼OpenSdk导入到工程项目:

implementation project(':LocalRepo:qlysdk')
implementation 'com.google.code.gson:gson:2.8.9'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1'

如图:

二、SDK使用方法

初始化

1、初始化SDK

    /**
     * 初始化SDK
     *
     * @param context    上下文
     * @param appId      从开放平台申请的appId
     * @param privateKey 从开放平台申请的密钥
     */

QlyOpenSdk.getInstance().init(context: Context, appId: String, privateKey: String)

2、设置开启调试模式

    /**
     * 设置开启调试模式
     * 默认关闭
     *
     * @param debug true为开启调试模式,false为关闭调试模式
     *              只有在调试模式下才会有日志输出
     */
   QlyOpenSdk.getInstance().setDebug(debug: Boolean)

3、打印日志

QlyOpenSdk.getInstance().setLogCallback(callback: LogCallback)

登录

1、设置开放平台鉴权token

    /**
     * 设置开发平台的token
     */
    QlyOpenSdk.getInstance().setOpenPlatformToken(token: String)

三、视频直播

开启会话

1、直播前需要建立链接

     /**
     * 连接设备
     * @param context 上下文
     * @param deviceId 设备ID
     * @param callback 连接设备回调
     */
QlyOpenSdk.getInstance().connect(context: Context, deviceId: String, callback: NetCallBack<BaseResponse<String>>)

直播

1、播放器配置及播放

val mPlayer= QlyOpenSdkPlayer(context, deviceId)
mPlayer.setMediaCodecEnabled(true) //设置是否硬解,默认true
mPlayer.setOnPlayerListener(object : OnPlayerListener {
        override fun onStateChanged(state: Int, code: Int) {
        }
        override fun onVideoSizeChanged(width: Int, height: Int) {
        }
        override fun onPlaybackComplete() {
        }
    })
View view = mPlayer.getView(); //获取播放界面,把此View添加到显示层级中
mPlayer.prepare()
mPlayer.start()

// 播放器状态监听回调说明
/**
     * 当播放器状态发生变化,通过此方法回调,具体状态如下:
     * {@link PlayStatus#STATE_ERROR}
     * {@link PlayStatus#STATE_IDLE}
     * {@link PlayStatus#STATE_PREPARING}
     * {@link PlayStatus#STATE_PREPARED}
     * {@link PlayStatus#STATE_BUFFERING}
     * {@link PlayStatus#STATE_BUFFERED}
     * {@link PlayStatus#STATE_PLAYING}
     * {@link PlayStatus#STATE_PAUSED}
     * {@link PlayStatus#STATE_STOPED}
     * {@link PlayStatus#STATE_COMPLETED}
     *
     * @param state 状态值
     * @param code  错误码,默认-1
     */
    fun onStateChanged(@PlayStatus state: Int, code: Int)

    /**
     * 当视频开始播放时回调视频真实尺寸
     *
     * @param width  宽
     * @param height 高
     */
    fun onVideoSizeChanged(width: Int, height: Int)

    /**
     * 播放完成
     */
     fun onPlaybackComplete()

2、暂停播放

   mPlayer.pause()

3、恢复播放

   mPlayer.resume()

4、语音通话

   /**
    * 开始通话
    * @param isDuplexTalk  是否是双工通话
    *
    */
    mPlayer.startAudio(isDuplexTalk: Boolean)

    // 注册通话状态监听器
    mPlayer.setOnOnAudioCallListener(object : OnAudioCallListener {
        override fun onAudioStateChanged(state: Int) {
           }
    })

    // 结束通话
    mPlayer.stopAudio()

    // 通话状态监听器说明
   /**
    * {@link AudioState#AUDIO_STATE_AVAILABLE} 可进行通话
    * {@link AudioState#AUDIO_STATE_UNAVAILABLE} 不可进行通话
    * {@link AudioState#AUDIO_STATE_ERROR_BUSY} 别人正在通话导致断开
    * {@link AudioState#AUDIO_STATE_ERROR_STOP} 通话异常断开
    *
    * @param state 状态
    */
    fun onAudioStateChanged(@AudioState state: Int)

5、释放播放器

  mPlayer.release()

6、倍速播放(目前支持 "0.5", "1", "2", "4", "8", "16", "32")

  mPlayer.setPlaySpeed(float speed)

7、播放器静音

  mPlayer.setMute(boolean mute)

8、获取当前播放时间

  mPlayer.getCurrentTime()

9、切换为直播

  mPlayer.switchToLive()

10、重新开始

  mPlayer.restart()

11、设置告警信息

/**
  *
  * @param TimeLineEventBean event 告警视频对象
  */
mPlayer.setEventInfo(event);

断开会话

1、在完成对摄像头操作后需要断开会话

QlyOpenSdk.getInstance().disconnect()

四、视频回看

说明:直播和回放互相切换无需重新初始化播放器, 直接进行seek**,回放部分初始化与释放阶段与直播类似,这一节只概述回放相关的细节,详细示例参见:

1、获取云存储回放片段

    /**
     * 获取云存储回放数据列表
     *
     * @param deviceId  设备id
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param callback  回调接口
     */

    QlyOpenSdk.getInstance().getTimelineSectionList(
        deviceId: String,
        startTime: Long,
        endTime: Long,
        callback: NetCallBack<BaseResponse<List<TimeLineSectionBean>>>,
        )

2、获取SD卡回放片段

  /**
   * 获取SD卡回放数据列表
   *
   * @param deviceId  设备id
   * @param startTime 开始时间
   * @param endTime   结束时间
   * @param callback  回调接口
   */
 QlyOpenSdk.getInstance().getSdcardTimelineSectionList(
        deviceId: String,
        startTime: Long,
        endTime: Long,
        callback: NetCallBack<BaseResponse<List<TimeLineSectionBean>>>,
    )

 // TimeLineSectionBean说明如下:
 public class TimeLineSectionBean implements Serializable {
    private String videoId;
    private long startTime;
    private long endTime;
    }

3、设置回放

在选择了某个时间点后调用如下方法进行播放:

  /**
   * 注意需要有数据的回放片段才能回放
   * @param time  回放位置时间戳
   */
   mPlayer.seek(time: Long)

设置回放类型(本地、云存储):

  /**
   * @param time 回放位置时间戳
   * @param type 设置回放类型(本地、云存储)
   *        {@link StorageType.CLOUD_STORAGE}
   *        {@link StorageType.SD_CARE_STORAGE}
   */
  mPlayer.seek(time: Long, @StorageType type: Int)

回放指定时间段:

    /**
     * 指定播放时间段
     * @param startTime 指定开始时间
     * @param endTime 当前只支持传-1
     */
    fun start(startTime: Long, endTime: Long)

4、实时预览

 mPlayer.querySectionThumbnail(
     thumbnailBean: SectionThumbnailBean,
     callback: NetCallBack<BaseResponse<SectionThumbnail>>,
 )

SectionThumbnailBean说明如下:

public class SectionThumbnailBean {
    private long time; // 获取缩略图的时间戳
    private String videoId; // 视频ID
    private long startTime; // 视频开始时间
    private long endTime; // 视频结束时间
}

五、视频告警

1、获取告警视频列表

    /**
     * 获取告警事件列表
     * 分页说明:上一次分页的最后一条数据的开始时间,
     *         作为下一次分页的结束时间
     *
     * @param deviceId  设备id
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param isPaging  是否分页
     * @param isCancel  是否取消上次请求
     * @param callback  回调接口
     */
  QlyOpenSdk.getInstance().getEventList(
        deviceId: String,
        startTime: Long,
        endTime: Long,
        isPaging: Boolean,
        isCancel: Boolean,
        callback: NetCallBack<BaseResponse<List<TimeLineEventBean>>>,
    )

2、TimeLineEventBean 说明如下

  public class TimeLineEventBean implements Serializable {
    private String eventId; // 事件id
    private long startTime; // 开始时间
    private long endTime; // 结束时间
    private String thumbnail; // 缩略图
    private String playAddress; // 播放地址
    private String videoId; // 视频ID
    private boolean isServerEvent; // 是否有套餐
    private int alarmType; //告警类型 通过个getEventType()获取
  }

3、TimeLineEventBean 中有一个EventType的枚举,具体如下

public enum EventType {
    Motion,//动作
    Sound,//声音
    Face,//人脸
    PeopleDetection,//人型检测
    PIR,//有人经过
    ModeLive,//门铃
    ManualRecord,//门铃拒接
    ManualDoorbellHasBeenRead,//门铃已接听
    DoorbellUnread,//门铃未接听
    VideoMsg,//视频留言
    VideocLip,//视频剪辑
    VideoPic,//视频拍照
    VideoCall,//视频电话
    EventWander,//有人逗留
    ForceDestroy,//暴力拆卸 强拆告警
    PrivateFR,//识别到某个人而没有录制的时间
    ManuelTurnOff,//手动关闭
    ScheduleTurnOff,//计划关闭
    SelfDelete,//被删除掉的时间段
    Upgrading,//Camera在升级的时候停止录制的时间段
    ModePir,//人体检测触发摄像机录制事件
    DoorWindow,//门磁打开触发摄像机录制事件
    OtherSensor,//其他传感器触发的摄像机录制事件
    sensorTypeEnd,//传感器类型
    BatteryMode,//强制拆迁的警告
    NormalSound,//盘旋报警
    ModeCall,//门铃按键
    Unknown
}

4、播放告警视频

val mPlayer= QlyOpenSdkPlayer(context, deviceId)
mPlayer.setMediaCodecEnabled(true) //设置是否硬解,默认true
mPlayer.setPlayerType(VNPlayer.PLAYER_TYPE_NORMAL);
mPlayer.setEventInfo(timeLineEvent);  // 把需要播放的事件数据设置到播放器中
mPlayer.prepare();
mPlayer.start();

六、设备能力

1、获取设备能力集合

    /**
     * 获取设备能力集
     */
    QlyOpenSdk.getInstance().getDeviceAbility(
        deviceId: String,
        callback: NetCallBack<BaseResponse<CameraAbility>>,
    )

2、获取设备信息

  /**
   * 获取设备信息
   */
   QlyOpenSdk.getInstance().getSettings(
     deviceId: String,
     callback: NetCallBack<BaseResponse<List<CameraSettingInfo>>>,
    )

七、设备能力

1、云台控制

    /**
     * 对设备进行上下左右方向的控制
     * @param deviceId 设备id
     * @param type     类型
     *                 {@link OpenPTZType#TurnOnce} 转动一次
     *                 {@link OpenPTZType#TurnContinue} 连续转动
     *                 {@link OpenPTZType#StopTurn} 停止转动
     * @param direct   如果类型为SetPosition则direct传null
     *                 {@link OpenPTZDirect#TurnLeft}向左
     *                 {@link OpenPTZDirect#TurnUp}向上
     *                 {@link OpenPTZDirect#TurnRight}向右
     *                 {@link OpenPTZDirect#TurnDown}向下
     * @param position 具体位置信息
     * @param callback 回调
     */
    QlyOpenSdk.getInstance().setPTZPosition(
        deviceId: String,
        type: OpenPTZType,
        direct: OpenPTZDirect?,
        position: IntArray?,
        callback: NetCallBack<BaseResponse<*>> )

2、旋转图像

  /**
   * 旋转图像180度
   */
 QlyOpenSdk.getInstance().rotate(
        deviceId: String,
        @PlayerRotate imageRotateValue: Int,
        callback: NetCallBack<BaseResponse<*>>,
    )

3、高标清切换

 /**
  * 高标清切换
  */
 QlyOpenSdk.getInstance().switchPlaybackQuality(
        deviceId: String,
        @PlayerHD hdVideoValue: Int,
        callback: NetCallBack<BaseResponse<*>>,
    )

八、重新配网

1、获取WIFI列表

 /**
  * 获取当前摄像机的wifi列表
  *
  */
QlyOpenSdk.getInstance().getWiFiList(
        deviceId: String,
        callback: NetCallBack<BaseResponse<List<ICameraWifiInfo>>>,
    )
AMODeviceWiFiInfo说明如下:
class TenantWifiInfo : ICameraWifiInfo, Serializable {
    var ssid: String = "" //路由器SSID
    var bssid: String = "" //路由器mac
    var signal: String = "" // 信号强度,范围1~5
    var key: String = ""// WIFI密码
    var encryptionType: String = "" // 加密方式
    var isConnected: Boolean = false // 是否是当前设备正在使用的Wi-Fi,true=是、false=否}

2、切换WIFI

    /**
     * 切换wifi连接
     */
    QlyOpenSdk.getInstance().changeCameraWifi(
        deviceId: String,
        wifiName: String,
        bssid: String,
        encryption: String,
        pass: String,
        signal: Int,
        callback: NetCallBack<BaseResponse<ICameraWifiInfo>>,
    )

九、释放QlyOpenSDK

   QlyOpenSdk.getInstance().unInit()