SDK使用方法

初始化

  • 在Application中初始化SDK
/**
* 初始化SDK
*
* @param context    上下文
* @param appId      从开放平台申请的appId
* @param privateKey 从开放平台申请的密钥
*/
AndMu.init(context, appId, privateKey);
  • 设置开启调试模式(可不设置)
/**
* 设置开启调试模式
* 默认关闭
*
* @param debug true为开启调试模式,false为关闭调试模式
*              只有在调试模式下才会有日志输出
*/
AndMu.setDebug(true);
  • 设置需要校验的Token

token通过自有平台从和目开放平台提供的api获取

AndMu.setToken(token);

在token无效(调用SDK接口返回的错误码为11503或者11504)、绑定设备及解绑设备后需要重新获取token并调用上面方法。

  • 初始化设备模块
/**
* 初始化设备模块
*
* @param callback 回调接口
*/
AndMu.getCamera().init(new InitCallback() {
    @Override
    public void onInit(boolean success, String msg) {
         //success为true表示初始化成功       
    }
});

设备绑定

通过以下方法可以启动一个专用于绑定的界面,具体的绑定方法可根据界面的提示操作

AndMu.getCamera().startBindDevice(context);

设备解绑

/**
* 解绑
*
* @param deviceId 设备ID
*/
AndMu.getCamera().unBindDevice(deviceId, new AMCallback<AMResponse>() {
    @Override
    public void onResponse(AMResponse response) {
        if (response.isSuccess()) {
            //解绑成功
        }
    }

    @Override
    public void onError(Throwable throwable) {
		//网络异常
    }
});

获取设备列表

获取设备列表需要在setToken后调用

/**
* 获取设备列表
*
* @param page     页数
* @param pageSize 每页大小
* @param callback 回调
*/
AndMu.getCamera().getDeviceList(page, pageSize, new AMCallback<AMResponse<List<AMCameraInfo>>>() {
    @Override
    public void onResponse(AMResponse<List<AMCameraInfo>> response) {
        if (response.isSuccess()) {
            //请求成功
        }
    }

    @Override
    public void onError(Throwable throwable) {

    }
});

获取设备缩略图

/**
* 获取设备缩略图
*
* @param deviceId 设备id
* @param callback 回调接口
*/
AndMu.getCamera().getThumbnail(deviceId, new AMCallback<AMResponse<AMThumbnail>>() {
    @Override
    public void onResponse(AMResponse<AMThumbnail> response) {
        if (response.isSuccess()) {

        }
    }

    @Override
    public void onError(Throwable e) {

    }
});

视频直播

播放相关详细逻辑请查看 DEMO

  • 开启会话
/**
* 连接
*/
AndMu.getCamera().connect(deviceId);
  • 直播

1、播放器配置及播放

AMPlayer mPlayer = null;
mPlayer = AMPlayerFactory.createPlayer(mContext, deviceId);//创建播放器
mPlayer.setCameraDevice(mCameraInfo);
mPlayer.setPlayerType(AMPlayer.PLAYER_TYPE_TIMELINE);
mPlayer.setFishEyeMode(false);//设置是否鱼眼模式,默认false
mPlayer.setMediaCodecEnabled(true);//设置是否硬解,默认true
mPlayer.setMultiChannels(false);//设置多通道,默认false
mPlayer.setPlaySdcard(false);//设置播放sdcard视频,默认false
View view = mPlayer.getView();//获取播放界面,把此View添加到显示层级中
//设置状态监听器
mPlayer.setOnAMPlayerListener(new AMPlayer.OnAMPlayerListener() {
    @Override
    public void onStateChanged(int state, int code) {

    }

    @Override
    public void onVideoSizeChanged(int width, int height) {

    }
});
mPlayer.prepare();
mPlayer.start();

播放器状态监听回调说明

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

/**
* 当视频开始播放时回调视频真实尺寸
*
* @param width  宽
* @param height 高
*/
public void onVideoSizeChanged(int width, int height);

2、暂停播放

mPlayer.pause();

3、恢复播放

mPlayer.resume();

4、语音通话

//开始通话
mPlayer.startAudio();
//注册通话状态监听器
mPlayer.setOnAudioStateListener(new AMPlayer.OnAudioStateListener() {
    @Override
    public void onStateChanged(int state) {
                    
    }
});
//结束通话
mPlayer.stopAudio();

语音状态监听说明

/**
* 语音状态回调
* <p>
* {@link AMPlayer#AUDIO_STATE_AVAILABLE} 可进行通话
* {@link AMPlayer#AUDIO_STATE_UNAVAILABLE} 不可进行通话
*
* @param state 状态
*/
public void onStateChanged(int state)

5、释放播放器

mPlayer.release();
  • 断开会话

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

AndMu.getCamera().disconnect();

视频回放

播放相关详细逻辑请查看 DEMO

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

首先要通过下面接口获取回放片段用以绘制

/**
* 获取回放数据列表
*
* @param deviceId  设备id
* @param startTime 开始时间
* @param endTime   结束时间
* @param callback  回调接口
*/
AndMu.getCamera().getTimelineSectionList(deviceId, startTime, endTime, new AMCallback<AMResponse<List<AMTimeLineSection>>>() {
    @Override
    public void onResponse(AMResponse<List<AMTimeLineSection>> response) {
        if (response.isSuccess()) {
            
        }
    }

    @Override
    public void onError(Throwable e) {
        
    }
});

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

//获取想要回放到的时间戳,注意需要有数据的回放片段才能回放
mPlayer.seek(time);

视频截图

截图需要在视频播放起来后进行

  • 截图保存到指定位置
/**
* 截图
*
* @param path     图片存放位置
* @param callback 截图回调
*/
mPlayer.screenShot(path, new AMPlayer.ScreenShotCallback() {
    @Override
    public void callback(boolean success, String path) {
                
    }
});
  • 抓取视频帧
Bitmap bitmap = mPlayer.screenShot();

告警视频

  • 获取告警视频列表
/**
* 获取告警事件列表
*
* @param deviceId  设备id
* @param startTime 开始时间
* @param endTime   结束时间
* @param callback  回调接口
*/
AndMu.getCamera().getEventList(deviceId, startTime, endTime, new AMCallback<AMResponse<List<AMTimeLineEvent>>>() {
    @Override
    public void onResponse(AMResponse<List<AMTimeLineEvent>> response) {
        if (response.isSuccess()) {
        }
    }

    @Override
    public void onError(Throwable e) {

    }
});

告警事件类型说明

//AMTimeLineEvent中有一个EventType的枚举,具体如下:
public enum EventType {
    //运动告警
    Motion,
    //声音告警
    Sound,
    //其它
    Unknown
}
  • 播放告警视频

播放相关详细逻辑请查看 DEMO

告警播放始化与释放阶段与直播类似,播放代码如下:

//把需要播放的事件数据设置到播放器中
mPlayer.setPlayerType(AMPlayer.PLAYER_TYPE_NORMAL);
mPlayer.setEventInfo(timeLineEvent);
mPlayer.prepare();
mPlayer.start();

设备设置

  • 获取设备配置信息
AndMu.getCamera().getSettings(deviceId, new AMCallback<AMResponse<AMCameraSettings>>() {
    @Override
    public void onResponse(AMResponse<AMCameraSettings> response) {
        if (response.isSuccess()) {
                    
        }
    }

    @Override
    public void onError(Throwable e) {

    }
});
  • 设置设备配置
SettingParams params = new SettingParams();
params.setSettingName(AMSettings.SETTING_TITLE);
params.setSettingValue("CAMERA");
AndMu.getCamera().saveSetting(deviceId, params, new AMCallback<AMResponse>() {
    @Override
    public void onResponse(AMResponse response) {
        if (response.isSuccess()) {
                    
        }
    }

    @Override
    public void onError(Throwable e) {

    }
});

具体配置项说明如下:

public interface AMSettings {
    public static final String SETTING_TITLE = "deviceName";//设备名称
    public static final String SETTING_STATUS = "deviceSwitch";//设备打开、关闭状态
    public static final String SETTING_SOUND_DETECTION = "soundDetection";//声音告警开关
    public static final String SETTING_MOTION_DETECTION = "motionDetection";//运动告警开关
    public static final String SETTING_SOUND_SENSITIVITY = "soundSensitivity";//声音告警灵敏度
    public static final String SETTING_MOTION_SENSITIVITY = "motionSensitivity";//运动告警灵敏度
    public static final String SETTING_CAMERA_SOUND = "volumeMute";//设备声音采集
    public static final String SETTING_STATUS_LIGHT = "statusLight";//设备状态指示灯
    public static final String SETTING_NIGHTVISION = "nightVision";//夜视开关
}

云台控制

/**
* 设置云台位置
*
* @param deviceId 设备id
* @param type     类型
*                 {@link AMPTZType#SetPosition} 设置位置
*                 {@link AMPTZType#TurnOnce} 转动一次
*                 {@link AMPTZType#ResetPosition} 复位位置
*                 {@link AMPTZType#TurnContinue} 连续转动
*                 {@link AMPTZType#StopTurn} 停止转动
* @param direct   如果类型为SetPosition则direct传null
*                 {@link AMPTZDirect#TurnLeft}向左
*                 {@link AMPTZDirect#TurnUp}向上
*                 {@link AMPTZDirect#TurnRight}向右
*                 {@link AMPTZDirect#TurnDown}向下
*                 {@link AMPTZDirect#Reset}恢复
* @param position 具体位置信息
* @param callback 回调
*/
public void setPTZPosition(String deviceId, AMPTZType type, AMPTZDirect direct, int[] position, AMCallback<AMResponse> callback) {
    @Override
    public void onResponse(AMResponse response) {
        if (response.isSuccess()) {
            
        }
    }

    @Override
    public void onError(Throwable e) {

    }
});

设备状态监听

  • 添加监听
AndMu.getCamera().addMessageListener(new OnMessageListener() {
     /**
     * 接收消息
     * 收到添加设备(MSG_ADD_NEW_CAMERA)和删除设备(MSG_DELETE_CAMERA)的消息时,需要向平台请求更新 token,并重新调用AndMu.setToken(token);
     *
     * @param type     消息类型
     * @param deviceId 设备ID
     * @param params   消息参数
     */
    @Override
    public void onReceiveMessage(String msgType, String deviceId, Object params) {
        if (AMCamera.MSG_CAMERA_OFFLINE.equals(msgType)) { //设备离线
 
        } else if (AMCamera.MSG_CAMERA_ONLINE.equals(msgType)) { //设备上线

        } else if (AMCamera.MSG_ADD_NEW_CAMERA.equals(msgType)) { //添加设备
            
        } else if (AMCamera.MSG_DELETE_CAMERA.equals(msgType)) { //删除设备
            
        }
    }
});
  • 删除监听
AndMu.getCamera().removeMessageListener(mMessageListener);

释放AndMuSDK

AndMu.unInit()