中文简体    English


爱为物联Android端SDK使用文档

以Android-app-sdk-demo工程搭建为例,(IDE为Androidstudio,AS),为开发者介绍SDK对接过程。
点击下载

快速接入

  1. 下载demo压缩包解压
  2. 拷贝libs下aar文件到自己工程对应的目录下
  3. build.gradle引入如下代码
    dependencies {
     ...
     implementation(name: 'ipclibrary-2021_12_13', ext: 'aar')
    }
    添加完成后的AS工程目录如下所示:

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主要流程

连接设备

步骤

  1. 初始设备上电后进行配网(二维码扫描、声波)
  2. 设备配网成功后,通过SDKManager.getInstance().discoveryDeviceInWLAN获取到设备UID等信息
  3. 创建IvyCamera对象,必须赋值UID、设备的用户名(usrName,初始值为admin)、设备的密码(password,初始密码可用SDKManager.getInstance().getFactoryPassword获取)
  4. 调用IvyCamera.loginDevice实现连接
  5. 调用IvyCamera.destroy释放连接

扫描二维码配网

初始状态设备的镜头扫描二维码进行配网

  1. 将wifi的ssid和密码通过SDKManager.getInstance().createQRInfo创建文本信息
  2. 据此文本信息生成对应的二维码图片,供设备扫描,等待设备播放扫码成功的语音提示后,等待设备接入网络即可。
  3. 在此期间,APP可以循环调用SDKManager.getInstance().discoveryDeviceInWLAN方法,直到搜索到指定设备则代表配网成功(可以通过搜索到的设备的uid与设备机身上的uid信息做比对筛选)。

    注:本sdk不提供识别二维码和生成二维码图片的功能,APP开发者可通过第三方库(zxing)自行实现。

声波配网

手机端播放声波信息让处于初始状态的设备接收

  1. 将wifi的ssid和密码通过SDKManager.getInstance().startSoundWaveAdd播放对应的声波信息;
  2. 播放完声波等待设备配网成功的语音提示后,等待设备接入网络
  3. 在此期间,APP可以循环调用SDKManager.getInstance().discoveryDeviceInWLAN方法,直到搜索到指定设备则代表配网成功(可以通过搜索到的设备的uid与设备机身上的uid信息做比对筛选)。

局域网搜索

搜索手机当前连接wifi下的已配网设备

  1. 调用SDKManager.getInstance().discoveryDeviceInWLAN获取到当前局域网下所有设备
  2. 匹配对应的设备信息进行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();
    }
    ```

说明

  1. 实时播放成功后可以进行以下操作:录像、拍照、画面翻转、对讲、云台控制、监听等,其中设备控制该接口的如云台控制和镜头显示功能、对讲,属于限制级接口,要优选通过判断设备的能力集来调用,设备能力集请查看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) {
                    }
                });

  1. 云台控制,发送了对应方向命令后,需要调用一次停止才能结束此次操作,建议用控件的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表示系统会继续处理
     }
  2. 切换清晰度

     ...
    // 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) {
             }
         });
  3. 选择查询出来的录像文件,调用PBVideoSurfaceView.openPBVideo(IvyCamera, recordIvyArr.get(position), this)打开回放;

  4. 调用PBVideoSurfaceView.closePBVideo()关闭当前回放录像;

文档更新时间: 2022-02-17 09:52   作者:庄小婵