Appearance
SDK使用方法
初始化
- 初始化SDK
java
/**
* 初始化SDK
*
* @param context 上下文
* @param appId 从平台申请的appId
* @param privateKey 从平台申请的密钥
*/
AndMuOpen.init(context, appId, privateKey);
- 设置开启调试模式(可不设置)
java
/**
* 设置开启调试模式
* 默认关闭
*
* @param debug true为开启调试模式,false为关闭调试模式
* 只有在调试模式下才会有日志输出
*/
AndMuOpen.setDebug(true);
- 设置服务器环境
java
/**
* 默认正式环境
*
* @param env {@link AMConstants#SERVER_ENV_PRO} 正式环境
* {@link AMConstants#SERVER_ENV_STG} 测试环境
* {@link AMConstants#SERVER_ENV_DEV} 开发环境
*/
AndMuOpen.setServerEnv(AMConstants.SERVER_ENV_PRO);
- 开放平台配置模块
java
/**
* 初始化设备模块
*
* @param callback 回调接口
*/
AndMuOpen.getCamera().init(new InitCallback() {
@Override
public void onInit(boolean success, String msg) {
//success为true表示初始化成功
}
});
登录
- 开放平台
token通过自有平台从和目开放平台提供的api获取
https://open.andmu.cn/doc/api/api-list.html#获取token-基础应用、专业版
java
AndMuOpen.setToken(token);
视频直播
注入设备列表
设备列表需要调用平台的接口然后注入给SDK
java
/**
* 注入设备给SDK
* page device AMODevice
*/
AndMuOpen.getCamera().addCameraInfo(device);
AMODevice信息说明:
java
AMODevice device = new AMODevice();
device.deviceId = "从平台获取的设备的id"
开启会话
直播前需要建立链接
java
/**
* 有回调的连接
*/
AndMuOpen.getCamera().connect(String deviceId, AMCallback<AMResponse> callback);
- 直播
1、播放器配置及播放
java
AMOPlayer mPlayer = null;
mPlayer = AMOPlayerFactory.createPlayer(mContext, deviceId);//创建播放器
mPlayer.setCameraDevice(mCameraInfo);
mPlayer.setPlayerType(AMOPlayer.PLAYER_TYPE_TIMELINE);
mPlayer.setFishEyeMode(false);//设置是否鱼眼模式,默认false
mPlayer.setMediaCodecEnabled(true);//设置是否硬解,默认true
mPlayer.setMultiChannels(false);//设置多通道,默认false
View view = mPlayer.getView();//获取播放界面,把此View添加到显示层级中
//设置状态监听器
mPlayer.setOnAMPlayerListener(new AMOPlayer.OnAMPlayerListener() {
@Override
public void onStateChanged(int state, int code) {
}
@Override
public void onVideoSizeChanged(int width, int height) {
}
});
mPlayer.prepare();
mPlayer.start();
播放器状态监听回调说明
java
/**
* 当播放器状态发生变化,通过此方法回调,具体状态如下:
* {@link AMOPlayer#STATE_ERROR}
* {@link AMOPlayer#STATE_IDLE}
* {@link AMOPlayer#STATE_PREPARING}
* {@link AMOPlayer#STATE_PREPARED}
* {@link AMOPlayer#STATE_BUFFERING}
* {@link AMOPlayer#STATE_BUFFERED}
* {@link AMOPlayer#STATE_PLAYING}
* {@link AMOPlayer#STATE_PAUSED}
* {@link AMOPlayer#STATE_STOPED}
* {@link AMOPlayer#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、暂停播放
java
mPlayer.pause();
3、恢复播放
java
mPlayer.resume();
4、语音通话
java
/**
* 开始通话
*
* @param isDuplexTalk 是否是双工通话
*/
mPlayer.startAudio(boolean isDuplexTalk);
//注册通话状态监听器
mPlayer.setOnAudioStateListener(new AMOPlayer.OnAudioStateListener() {
@Override
public void onAudioStateChanged(int state, int code) {
}
});
//结束通话
mPlayer.stopAudio();
语音状态监听说明
java
/**
* <p>
* {@link AMOPlayer#AUDIO_STATE_AVAILABLE} 可进行通话
* {@link AMOPlayer#AUDIO_STATE_UNAVAILABLE} 不可进行通话
* {@link AMOPlayer#AUDIO_STATE_ERROR_BUSY} 别人正在通话导致断开
* {@link AMOPlayer#AUDIO_STATE_ERROR_STOP} 通话异常断开
*
* @param state 状态
*/
public void onAudioStateChanged(int state)
5、释放播放器
java
mPlayer.release();
6、倍速播放
java
//倍速播放 (目前支持0.5 1 2 4 8 16 32)
mPlayer.setPlaySpeed(float speed);
7、播放器静音
java
//设置静音
mPlayer.setMute(boolean mute);
8、通话变声
java
//语音通话变声 value 取值-10.0-10.0
mPlayer.changeVoice(float value);
9、获取当前播放时间
java
mPlayer.getCurrentTime();
10、切换为直播
java
mPlayer.switchToLive();
11、设置点播url
java
mPlayer.setPlayUrl(String url);
12、重新开始
java
mPlayer.restart();
13、设置告警信息
java
/**
* 设置告警信息
*
* @param AMTimeLineEvent event 告警信息
*/
mPlayer.setEventData(event);
14、获取当前通话音量
java
mPlayer.getDecibele();
15、设置是否多分屏播放
java
/**
* 设置是否多分屏播放
*
* @param multiScreenPlay true表示当前为多分屏
*/
mPlayer.setMultiScreenPlay(multiScreenPlay);
16、是否横屏
java
/**
* 设置是否多分屏播放
*
* @param boolean isFull
*/
mPlayer.setFull(isFull);
17、是否操作手势
java
/**
* 是否操作手势
*
* @param boolean isTouch
*/
mPlayer.setTouchEvent(isTouch);
- 断开会话
在完成对摄像头操作后需要断开会话
java
AndMuOpen.getCamera().disconnect();
视频回看
直播和回放互相切换无需重新初始化播放器,直接进行 seek
**,回放部分初始化与释放阶段与直播类似,这一节只概述回放相关的细节,详细示例参见
首先要通过下面接口获取回放片段用以绘制
- 获取回放片段**
java
/**
* 获取回放数据列表
*
* @param deviceId 设备id
* @param startTime 开始时间
* @param endTime 结束时间
* @param callback 回调接口
*/
public void getTimelineSectionList(String deviceId, long startTime, long endTime, AMOCallback<AMResponse<List<AMOTimeLineSection>>> callback);
支持SD卡回放的设备可以获取本地回放数据:
java
/**
* 获取回放数据列表
*
* @param deviceId 设备id
* @param startTime 开始时间
* @param endTime 结束时间
* @param callback 回调接口
*/
public void getSdcardTimelineSectionList(String deviceId, long startTime, long endTime, AMOCallback<AMOResponse<List<AMOTimeLineSection>>> callback);
注:如果是分享设备需要在调用此接口前调用如下接口:
java
/**
* 设置shareId
*
* @param shareId 分享id
*/
public void setupShareToken(String shareId, AMOCallback<AMOResponse> callback);
AMOTimeLineSection说明如下:
java
public class AMOTimeLineSection implements Serializable {
private String videoId;
private long startTime;
private long endTime;
}
在选择了某个时间点后调用如下方法进行播放:
java
//获取想要回放到的时间戳,注意需要有数据的回放片段才能回放
mPlayer.seek(time);
回放时间段:
java
//获取想要回放到的时间段,注意需要有数据的回放片段才能回放
mPlayer.seek(long startTime, long endTime);
设置回放类型(本地、云存储):
java
//0 云存储,1 SD卡
mPlayer.seek(long time, int type);
回放指定时间段:
java
// @param startTime 指定开始时间
// @param endTime 当前只支持传-1
mPlayer.start(long startTime, long endTime);
实时预览
java
/**
* 获取TimeLine缩略图
* @param time 时间
* @param size 尺寸 "320x180"
* @param section AMOTimeLineSection
* @param callback 回调
*/
mPlayer.getSectionThumbnail(long time, Size size, AMOTimeLineSection section, AMOCallback<AMResponse<AMOSectionThumbnail>> callback);
AMOSectionThumbnail说明如下:
java
//url与thumbnailData哪个不为空用哪个
public class AMOTimeLineEvent implements Serializable {
private String url;
private byte[] thumbnailData;
}
视频截图
截图需要在视频播放起来后进行
- 截图保存到指定位置
java
/**
* 截图
*
* @param path 图片存放位置
* @param callback 截图回调
*/
mPlayer.screenShot(path, new AMOPlayer.ScreenShotCallback() {
@Override
public void callback(boolean success, String path) {
}
});
- 抓取视频帧
java
Bitmap bitmap = mPlayer.screenShot();
告警视频
- 获取告警视频列表
java
/**
* 获取告警事件列表
*
* @param deviceId 设备id
* @param startTime 开始时间
* @param endTime 结束时间
* @param isPaging 是否分页
* @param isCancel 是否取消上次请求
* @param generate 是否生成缩略图地址 1 表示不生成缩略图地址,0 表示生成缩略图地址
* @param callback 回调接口
*/
public void getEventList(String deviceId, long startTime, long endTime,boolean isPaging, boolean isCancel,int generate,AMOCallback<AMResponse<List<AMOTimeLineEvent>>> callback);
注:如果是分享设备需要在调用此接口前调用如下接口:
java
/**
* 设置shareId
*
* @param shareId 分享id
*/
public void setupShareToken(String shareId, AMOCallback<AMOResponse> callback);
java
/**
* 删除告警
*
* @param deviceId 设备id
* @param event 删除的告警
*/
public void deleteEvent(String deviceId, AMOTimeLineEvent event, AMOCallback<AMOResponse> callback);
AMOTimeLineEvent说明如下:
java
public class AMOTimeLineEvent 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;//是否有套餐
}
告警事件类型说明
java
//AMTimeLineEvent中有一个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
}
- 播放告警视频
告警播放始化与释放阶段与直播类似,播放代码如下:
java
//把需要播放的事件数据设置到播放器中
mPlayer.setPlayerType(AMPlayer.PLAYER_TYPE_NORMAL);
mPlayer.setEventInfo(timeLineEvent);
mPlayer.prepare();
mPlayer.start();
设备能力
- 获取设备能力
java
/**
* 获取设备能力及配置
*
* @param deviceId 设备id
*/
public void getDeviceAbility(String deviceId, AMOCallback<AMResponse<AMOCameraAbility>> callback);
文件相关
- 获取云存储大小
java
/**
* 获取云存储大小
*
* @param deviceId 设备id
*/
public void getCloudStorageInfo(String deviceId, AMOCallback<AMOResponse<AMOCloudStorageInfo>> callback);
AMOCloudStorageInfo说明如下:
java
public class AMOCloudStorageInfo implements Serializable {
private long usedStorage;//已用存储
private long totalStorage;//总存储
private String description;//描述
}
其它功能
- 云台控制
java
/**
* 设置云台位置
*
* @param deviceId 设备id
* @param type 类型
* {@link AMOPTZType#SetPosition} 设置位置
* {@link AMOPTZType#TurnOnce} 转动一次
* {@link AMOPTZType#ResetPosition} 复位位置
* {@link AMOPTZType#TurnContinue} 连续转动
* {@link AMOPTZType#StopTurn} 停止转动
* @param direct 如果类型为SetPosition则direct传null
* {@link AMOPTZDirect#TurnLeft}向左
* {@link AMOPTZDirect#TurnUp}向上
* {@link AMOPTZDirect#TurnRight}向右
* {@link AMOPTZDirect#TurnDown}向下
* {@link AMOPTZDirect#Reset}恢复
* @param position 具体位置信息
* @param callback 回调
*/
public void setPTZPosition(String deviceId, AMOPTZType type, AMOPTZDirect direct, int[] position, AMOCallback<AMOResponse> callback)
- 获取SD卡信息
java
/**
* 获取SD卡信息
*
* @param deviceId 设备id
*/
public void getSDCardInfo(String deviceId, AMOCallback<AMResponse<AMOSDCardInfo>> callback);
AMOSDCardInfo说明如下:
java
public class AMOSDCardInfo implements Serializable {
private int state;//sd卡状态:0 不存在,1正常,2 异常,3 容量满,4 未知
private String totalSize;//总容量
private String freeSize;//可用容量
}
- 格式化SD卡
java
/**
* 格式化SD卡
*
* @param deviceId 设备id
* @param timeout 超时时间,传0则默认为20秒,最大值55
*/
public void formatSDCard(String deviceId,int timeout, AMOCallback<AMOResponse<AMOFormatSDCardInfo>> callback);
AMOFormatSDCardInfo说明如下:
java
public class AMOFormatSDCardInfo implements Serializable {
private int formatResponse ; //0失败、1成功、2设备响应超时
}
重新配网
- 获取WIFI列表
java
/**
* 获取设备wifi列表
*
* @param deviceId 设备id
*/
public void getWiFiList(String deviceId, AMOCallback<AMOResponse<List<AMODeviceWiFiInfo>>> callback);
AMODeviceWiFiInfo说明如下:
java
public class AMODeviceWiFiInfo implements Serializable {
private int connected;//0.未连接 1.已连接
private String bssid;//路由器mac
private String encryption;//加密方式
private int signal;//信号强度
private String ssid;//路由器SSID
private String password;//密码,切换WIFi时候用
}
- 切换WIFI
java
/**
* 切换wifi
*
* @param deviceId 设备id
*/
public void changeDeviceWiFi(String deviceId, AMODeviceWiFiInfo info, AMOCallback<AMOResponse> callback);
- 获取电池电量
java
/**
* 电池状态
*
* @param deviceId 设备id
*/
public void getBatteryState(String deviceId, AMOCallback<AMOResponse<AMOBatteryState>> callback);
AMOBatteryState说明如下:
java
public class AMOBatteryState implements Serializable {
private int state;//1-表示低电量;2-表示正在充电;3-表示电池充满了;4-表示其它正常状态
private int percent;//percent: 电池电量百分比
}
- 门铃唤醒
java
/**
* 门铃唤醒
*
* @param deviceId 设备id
*/
public void wakeUpBell(String deviceId, AMOCallback<AMOResponse> callback);
- 获取WiFI强度
java
/**
* 获取wifi强度
*
* @param deviceId 设备id
*/
public void getWiFiStrength(String deviceId, AMOCallback<AMOResponse<Integer>> callback);
请求错误码统一回调给App
java
AndMuOpen.getCamera().addResultCodeListener(new AMOResultCodeListener() {
/**
* 根据resultCode判断回调是否需要拦截,不传则为false
*
* @param resultCode 请求接口返回的Code
*/
@Override
public boolean isIntercept(String resultCode) {
return false;
});
释放AndMuOpenSDK
java
AndMuOpen.unInit()
混淆
java
#-----------------------------andmuopensdk----------------------------
-ignorewarnings
-dontshrink
-keep interface * {
<methods>;
<fields>;
}
-keepclasseswithmembernames class * {
native <methods>;
}
-keep class * extends android.app.Activity
-keep class * implements java.io.Serializable{*;}
-keep class com.cmcc.andmuopensdk.AndMuOpen { *; }
-keep class com.cmcc.hemu.HeMu { *; }
-keep class com.cmcc.andmuopensdk.base.restapi.** { *; }
-keep class com.cmcc.andmuopensdk.base.utils.** {*;}
-keep class com.cmcc.andmuopensdk.camera.utils.** {*;}
-keep class com.cmcc.andmuopensdk.camera.devicestate.** {*;}
-keep class com.cmcc.andmuopensdk.camera.restapi.** {*;}
-keep class com.cmcc.andmuopensdk.camera.cache.** {*;}
-keep class com.cmcc.andmuopensdk.camera.closeli.restapi.** {*;}
-keep class com.cmcc.andmuopensdk.camera.session.** {*;}
-keep class com.cmcc.andmuopensdk.camera.AMOCamera {*;}
-keep class com.cmcc.andmuopensdk.base.config.AMOGlobal {*;}
-keep class com.cmcc.andmuopensdk.camera.player.** {*;}
-keep class com.cmcc.andmuopensdk.camera.downloadlocal.** {*;}
-keep class com.cmcc.andmuopensdk.camera.widget.** {*;}
-keep class com.cmcc.andmuopensdk.camera.closeli.** {*;}
-keep class com.cmcc.andmuopensdk.base.net.** {*;}
-keep interface com.ont.media.player.** {*;}
-keep class com.ont.media.player.** {*;}
-keep class com.v2.** {*;}
-keep class com.v3.** {*;}
-keep class com.clplayer.** {*;}
-keep class com.cmmf.** {*;}
-keep class com.closeli.** {*;}
-keep class com.onenet.** {*;}
-keep class com.arcsoft.** {*;}
-keep class com.tencent.** {*;}
-keep class org.simpleframework.** {*;}
-keep class com.cmcc.andmuopensdk.camera.cmiot.handler.** {*;}
-keep class com.cmcc.andmuopensdk.camera.onenet.** {*;}
-keep class com.google.a.a.** {*;}
-keep public class com.v2.settings.bean.** {
<fields>;
<methods>;
}