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 mac 设备mac
*/
AndMu.getCamera().startWiredBind(String mac, AMCallback<AMResponse> callback);

SoftAP绑定

SoftAP绑定前,需要先获取绑定节点信息

AndMu.getCamera().getBindNodeInfo(AMCallback<AMResponse<AMNodeInfo>> callback);

SoftAP绑定

/**
* SoftAP绑定
*
* @param param
* @param timeout 超时时间
* @param info 绑定节点信息
*/
AndMu.getCamera().startSoftAPBind(AMSoftAPParam param, AMNodeInfo info, long timeout, new AMCallback<AMResponse>() {
    @Override
    public void onResponse(AMResponse response) {
        
    }

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

绑定节点信息数据结构AMNodeInfo说明

public class AMNodeInfo implements Serializable {
    private String account;
    private String token;
    private String shortToken;
    private String unifiedId;
}

AMSoftAPParam说明

public class AMSoftAPParam implements Serializable {
    private String ssid;//wifi名称
    private String password;//wifi名称
    private int mode;//加密方式:0: open; 1: wpa; 2: wpa2; 3:wep; 4: wpa/wpa2; -1: unknown
    private String locale;//区域值固定值 0zh_CN
    private String regtype;//注册方式,0:无线、1:有线
}

设备解绑

/**
* 解绑
*
* @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、语音通话

/**
* 开始通话
*
* @param isDuplexTalk  是否是双工通话
*/
mPlayer.startAudio(boolean isDuplexTalk);
//注册通话状态监听器
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();

6、倍速播放

//倍速播放 (目前支持0.5 1 2 4 8 16)
mPlayer.setPlaySpeed(float speed);

7、播放器静音

//设置静音
mPlayer.setMute(boolean mute);
  • 断开会话

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

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);

从指定时间开始播放(回放, 单位 ms)

// @param startTime 指定开始时间
// @param endTime 当前只支持传-1
mPlayer.start(long startTime, long endTime);

实时预览

// @param time 获取缩略图的时间戳
// @param size 图片尺寸 如:"320x180"
timeLineSection.getThumbnailUrl(long time, String size);

回放信息数据结构AMTimeLineSection说明:

public class AMTimeLineSection implements Serializable {
    private String videoId;
    private long startTime;
    private long endTime;
    private String thumbnailUrl;
}

视频截图

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

  • 截图保存到指定位置
/**
* 截图
*
* @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();

设备设置

  • 获取设备能力及配置信息
/**
* 获取设备能力集
*
* @param deviceId 设备id
*/
AndMu.getCamera().getDeviceAbility(deviceId, new AMCallback<AMResponse<AMCameraAbility>>() {
    @Override
    public void onResponse(AMResponse<AMCameraAbility> 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";//夜视开关
    public static final String SETTING_HDVIDEO = "hdVideo";//高清视频
    public static final String SETTING_CAMERAIMAGEROTATE = "cameraImageRotate"; //是否旋转图像
}

云台控制

/**
* 设置云台位置
*
* @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)) { //删除设备

        }else if (AMCamera.MSG_UPGRADING_CAMERA.equals(type)) { //固件升级

        }
    }
});
  • 删除监听
AndMu.getCamera().removeMessageListener(mMessageListener);

固件版和固件升级

建议:判断升级成功建议通过升级后收到上线消息,重新获取当前固件版本判断是否升级成功。

  • 固件版本
/**
* 获取固件升级信息
*
* @param deviceIds 设备id列表
*/
AndMu.getCamera().getUpgradeInfo(deviceIds,new AMCallback<AMResponse<List<AMUpgradeInfo>>>() {
    @Override
    public void onResponse(AMResponse<List<AMUpgradeInfo>> response) {

    }

    @Override
    public void onError(Throwable e) {

    }
});

固件升级信息数据结构AMUpgradeInfo说明:

public class AMUpgradeInfo implements Serializable {
    //设备id
    private String deviceId;
    //1. 升级中继 2.升级自设备 3.全部升级
    private int type;
    //服务类型(1:固件升级,2:摄像头APP升级,3:Andlink升级)
    private int serviceType;
    //升级类型(1:无升级,2:有升级,3:强制升级,4:unknow)
    private int upgradeType;
    //当前固件版本
    private String curFirmwareVersion;
    //当前应用版本
    private String curCameraAppVersion;
    //新版本
    private String newVersion;
    //新版本
    private String newSubVersion;
    //升级链接
    private String upgradeUrl;
    private String isUpgrade;
    //说明
    private String description;
    //校验
    private String checksum;
}
  • 固件升级
/**
* 开始升级
*
* @param AMUpgradeInfo upgradeInfo 设备对应的升级信息
*/
AndMu.getCamera().startUpgrade(upgradeInfo, new AMCallback<AMResponse>() {
     @Override
     public void onResponse(AMResponse response) {

     }

     @Override
     public void onError(Throwable e) {

     }
});

固件升级回调信息数据结构AMUpgradeState说明:

public class AMUpgradeState implements Serializable {
    //正在下载
    public static final int DOWNLOADING = 100;
    //下载失败
    public static final int DOWNLOAD_FAILED = 107;
    //升级成功
    public static final int UPGRADE_SUCCESS = 201;
    //升级失败
    public static final int UPGRADE_FAILED = 206;
    //设备id
    private String deviceId;
    //下载进度
    private int downloadProgress;
    //升级状态
    private int upgradeState;
}

重新配网

  • 获取WIFI信息
/**
*
* @param deviceId 设备ID
*/
AndMu.getCamera().getWiFiList(deviceId, new AMCallback<AMResponse<List<AMDeviceWiFiInfo>>>() {
     @Override
     public void onResponse(AMResponse<List<AMDeviceWiFiInfo>> response) {

     }

     @Override
     public void onError(Throwable e) {

     }
});

设备wifi信息数据结构AMDeviceWiFiInfo说明:

public class AMDeviceWiFiInfo implements Serializable {
    //是否连接 0.未连接 1.已连接;
    private int connected;
    //路由器mac
    private bssid;
    //加密方式
    private encryption;
    //信号强度 0-5, 数字越大,信号越强
    private int signal;
    //路由器SSID
    private ssid;
   //密码,切换WIFi时候用
    private password;
}
  • 切换WIFI
/**
*
* @param deviceId 设备ID
* @param AMDeviceWiFiInfo wiFiInfo 新的wifi信息
*/
AndMu.getCamera().changeDeviceWiFi(deviceId, wiFiInfo, new AMCallback<AMResponse>() {
     @Override
     public void onResponse(AMResponse response) {

     }

     @Override
     public void onError(Throwable e) {

     }
});

释放AndMuSDK

AndMu.unInit()