SDK使用方法

初始化

  • 初始化SDK
/**
* 初始化SDK
*
* @param context    上下文
* @param appId      从平台申请的appId
* @param privateKey 从平台申请的密钥
*/
AndMuOpen.init(context, appId, privateKey);
  • 设置开启调试模式(可不设置)
/**
* 设置开启调试模式
* 默认关闭
*
* @param debug true为开启调试模式,false为关闭调试模式
*              只有在调试模式下才会有日志输出
*/
AndMuOpen.setDebug(true);
  • 设置服务器环境
/**
* 默认正式环境
*
* @param env {@link AMConstants#SERVER_ENV_PRO} 正式环境
*            {@link AMConstants#SERVER_ENV_STG} 测试环境
*            {@link AMConstants#SERVER_ENV_DEV} 开发环境
*/
AndMuOpen.setServerEnv(AMConstants.SERVER_ENV_PRO);
  • 开放平台配置模块
/**
* 初始化设备模块
*
* @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-基础应用、专业版

AndMuOpen.setToken(token);

视频直播

  • 注入设备列表

    设备列表需要调用平台的接口然后注入给SDK

    https://open.andmu.cn/doc/api/api-list.html#获取设备列表

/**
* 注入设备给SDK
* page device AMODevice
*/
 AndMuOpen.getCamera().addCameraInfo(device);

AMODevice信息说明:

AMODevice device = new AMODevice();
device.deviceId = "从平台获取的设备的id"
  • 开启会话

    直播前需要建立链接

/**
* 有回调的连接
*/
AndMuOpen.getCamera().connect(String deviceId, AMCallback<AMResponse> callback);
  • 直播

1、播放器配置及播放

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

播放器状态监听回调说明

/**
* 当播放器状态发生变化,通过此方法回调,具体状态如下:
* {@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、暂停播放

mPlayer.pause();

3、恢复播放

mPlayer.resume();

4、语音通话

/**
* 开始通话
*
* @param isDuplexTalk  是否是双工通话
*/
mPlayer.startAudio(boolean isDuplexTalk);
//注册通话状态监听器
mPlayer.setOnAudioStateListener(new AMOPlayer.OnAudioStateListener() {
    @Override
    public void onAudioStateChanged(int state, int code) {
                    
    }
});
//结束通话
mPlayer.stopAudio();

语音状态监听说明

/**
* <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、释放播放器

mPlayer.release();

6、倍速播放

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

7、播放器静音

//设置静音
mPlayer.setMute(boolean mute);

8、通话变声

//语音通话变声 value 取值-10.0-10.0
mPlayer.changeVoice(float value);

9、获取当前播放时间

mPlayer.getCurrentTime();

10、切换为直播

mPlayer.switchToLive();

11、设置点播url

mPlayer.setPlayUrl(String url);

12、重新开始

mPlayer.restart();

13、设置告警信息

/**
* 设置告警信息
*
* @param AMTimeLineEvent event  告警信息
*/
mPlayer.setEventData(event);

14、获取当前通话音量

mPlayer.getDecibele();

15、设置是否多分屏播放

/**
* 设置是否多分屏播放
*
* @param multiScreenPlay true表示当前为多分屏
*/
mPlayer.setMultiScreenPlay(multiScreenPlay);

16、是否横屏

/**
* 设置是否多分屏播放
*
* @param boolean isFull
*/
mPlayer.setFull(isFull);

17、是否操作手势

/**
* 是否操作手势
*
* @param boolean isTouch
*/
mPlayer.setTouchEvent(isTouch);
  • 断开会话

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

AndMuOpen.getCamera().disconnect();

视频回看

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

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

  • 获取回放片段**
/**
* 获取回放数据列表
*
* @param deviceId  设备id
* @param startTime 开始时间
* @param endTime   结束时间
* @param callback  回调接口
*/
public void getTimelineSectionList(String deviceId, long startTime, long endTime,  AMOCallback<AMResponse<List<AMOTimeLineSection>>> callback);

支持SD卡回放的设备可以获取本地回放数据:

/**
* 获取回放数据列表
*
* @param deviceId  设备id
* @param startTime 开始时间
* @param endTime   结束时间
* @param callback  回调接口
*/
public void getSdcardTimelineSectionList(String deviceId, long startTime, long endTime,  AMOCallback<AMOResponse<List<AMOTimeLineSection>>> callback);

注:如果是分享设备需要在调用此接口前调用如下接口:

/**
* 设置shareId
*
* @param shareId 分享id
*/
public void setupShareToken(String shareId, AMOCallback<AMOResponse> callback);

AMOTimeLineSection说明如下:

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

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

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

回放时间段:

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

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

//0 云存储,1 SD卡
mPlayer.seek(long time, int type);

回放指定时间段:

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

实时预览

/**
* 获取TimeLine缩略图
* @param time 时间
* @param size 尺寸 "320x180"
* @param section AMOTimeLineSection
* @param callback 回调
*/
mPlayer.getSectionThumbnail(long time, Size size, AMOTimeLineSection section, AMOCallback<AMResponse<AMOSectionThumbnail>> callback);

AMOSectionThumbnail说明如下:

//url与thumbnailData哪个不为空用哪个
public class AMOTimeLineEvent implements Serializable {
   private String url;
   private byte[] thumbnailData;

视频截图

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

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

告警视频

  • 获取告警视频列表
/**
* 获取告警事件列表
*
* @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);

注:如果是分享设备需要在调用此接口前调用如下接口:

/**
* 设置shareId
*
* @param shareId 分享id
*/
public void setupShareToken(String shareId, AMOCallback<AMOResponse> callback);
/**
* 删除告警
*
* @param deviceId 设备id
* @param event    删除的告警
*/
public void deleteEvent(String deviceId, AMOTimeLineEvent event, AMOCallback<AMOResponse> callback);

AMOTimeLineEvent说明如下:

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;//是否有套餐

告警事件类型说明

//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
}
  • 播放告警视频

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

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

设备能力

  • 获取设备能力
/**
* 获取设备能力及配置
*
* @param deviceId 设备id
*/
public void getDeviceAbility(String deviceId, AMOCallback<AMResponse<AMOCameraAbility>> callback);

文件相关

  • 获取云存储大小
/**
* 获取云存储大小
*
* @param deviceId 设备id
*/
public void getCloudStorageInfo(String deviceId, AMOCallback<AMOResponse<AMOCloudStorageInfo>> callback);

AMOCloudStorageInfo说明如下:

public class AMOCloudStorageInfo implements Serializable {
    private long usedStorage;//已用存储
    private long totalStorage;//总存储
    private String description;//描述
}

其它功能

  • 云台控制
/**
* 设置云台位置
*
* @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卡信息
/**
* 获取SD卡信息
*
* @param deviceId 设备id
*/
public void getSDCardInfo(String deviceId, AMOCallback<AMResponse<AMOSDCardInfo>> callback);

AMOSDCardInfo说明如下:

public class AMOSDCardInfo implements Serializable {
    private int state;//sd卡状态:0 不存在,1正常,2 异常,3 容量满,4 未知
    private String totalSize;//总容量
    private String freeSize;//可用容量
}
  • 格式化SD卡
/**
* 格式化SD卡
*
* @param deviceId 设备id
* @param timeout 超时时间,传0则默认为20秒,最大值55
*/
public void formatSDCard(String deviceId,int timeout, AMOCallback<AMOResponse<AMOFormatSDCardInfo>> callback);

AMOFormatSDCardInfo说明如下:

public class AMOFormatSDCardInfo implements Serializable {
        private int formatResponse ; //0失败、1成功、2设备响应超时
}

重新配网

  • 获取WIFI列表
/**
* 获取设备wifi列表
*
* @param deviceId 设备id
*/
public void getWiFiList(String deviceId, AMOCallback<AMOResponse<List<AMODeviceWiFiInfo>>> callback);

AMODeviceWiFiInfo说明如下:

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
/**
* 切换wifi
*
* @param deviceId 设备id
*/
public void changeDeviceWiFi(String deviceId, AMODeviceWiFiInfo info, AMOCallback<AMOResponse> callback);
  • 获取电池电量
/**
* 电池状态
*
* @param deviceId 设备id
*/
public void getBatteryState(String deviceId, AMOCallback<AMOResponse<AMOBatteryState>> callback);

AMOBatteryState说明如下:

public class AMOBatteryState implements Serializable {
    private int state;//1-表示低电量;2-表示正在充电;3-表示电池充满了;4-表示其它正常状态
    private int percent;//percent: 电池电量百分比
}
  • 门铃唤醒
/**
* 门铃唤醒
*
* @param deviceId 设备id
*/
public void wakeUpBell(String deviceId, AMOCallback<AMOResponse> callback);
  • 获取WiFI强度
/**
* 获取wifi强度
*
* @param deviceId 设备id
*/
public void getWiFiStrength(String deviceId, AMOCallback<AMOResponse<Integer>> callback);

请求错误码统一回调给App

AndMuOpen.getCamera().addResultCodeListener(new AMOResultCodeListener() {
    /**
     * 根据resultCode判断回调是否需要拦截,不传则为false
     *
     * @param resultCode 请求接口返回的Code
     */
    @Override
     public boolean isIntercept(String resultCode) {
      return false;
});

释放AndMuOpenSDK

AndMuOpen.unInit()

混淆

#-----------------------------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>;
}