OpenSDK组件
# Android OpenSDK对接文档
以Demo工程搭建为例(IDE为AndroidStudio,AS),为开发者介绍OpenSDK对接过程。
# 1. OpenSDK安装
- 下载Android OpenSDK压缩包解压
- 拷贝libs/LCOpenSDK.aar文件到自己工程对应的目录下。
添加完成后的AS工程结构如下如所示:
# 2. 工程配置
# 2.1 配置AndroidManifest
在AndroidManifest.xml中需设置相关权限:
<!-- 基础权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 配网所需权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<!-- 对讲所需权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
注意:请务必设置相关的权限,否则可能导致某些失败:未开启语音权限将导致对讲失败;未开启读写权限导致录像下载失败,无线配网无声音且配网失败等。
# 2.2 配置build.gradle
在AS工程的app的build.gradle文件中可根据需要选择兼容的架构:
android {
…
defaultConfig {
…
ndk{
abiFilters "armeabi","arm64-v8a"//开发者根据实际情况选择要兼容的架构
}
}
}
2
3
4
5
6
7
8
9
# 3. 设备添加功能
设备添加是指先给设备配网,然后再将设备绑定到当前账号下的过程。
SDK目前支持的配网方式有:无线配网和Soft AP配网两种(有线不需要配网)。
由于无线添加流程比较复杂,为方便开发者灵活自由的实现设备添加的功能,我们提供两种添加设备的方案:一是直接调用SDK提供的接口,由开发者自己实现设备添加功能;二是使用demo中封装好的设备添加模块,实现快速对接。
备注:
未被绑定的设备添加说明:
1、配网前需明晰当前设备所支持的配网类型,然后选择相应的配网方式。
2、对于无线设备,需要用无线配对功能传递设备Wifi的密码,设备上线后方可添加。
3、对于支持软AP方式添加的设备(设备有热点),需要使用软AP配对功能。
4、对于有线,连上网线后直接查询状态在线即可添加(无配网过程,但网线必须能连接到外网)。
下面分别介绍两类方案的对接流程:
# 3.1 调用SDK接口无线添加
# 3.1.1 SmartConfig添加
设备添加步骤:
开发者获取设备S/N等信息:通过扫描设备底部标签,或者手动输入
调用unBindDeviceInfo接口查询设备支持的配网方式和绑定状态
检查设备是否已被绑定
判断当前设备所支持的配网类型是否为smartConfig
开始无线配网并在局域网内搜索设备初始化信息
搜索到设备后停止配网,停止搜索设备
初始化设备(设备无安全码时需要通过sdk初始化)
检查设备是否在线和当前能力集
绑定设备
# 3.1.2 SoftAp添加
设备添加步骤:
开发者获取设备S/N等信息:通过扫描设备底部标签,或者手动输入
调用unBindDeviceInfo接口查询设备支持的配网方式和绑定状态
检查设备是否已被绑定
判断当前设备所支持的配网类型是否为SoftAP
局域网搜索设备初始化信息:如搜索到设备信息,可直接进行绑定
开始SoftAp配网
检查设备是否在线和当前能力集
绑定设备
# 3.2 集成LCDeviceAddModule
设备添加步骤:
导入设备添加组件,参考Android标准化Demo说明文档
布局文件中添加用于触发设备添加的控件
<TextView
android:id="@+id/tv_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
2
3
4
5
6
7
8
9
- 初始化设备添加模块
try {
//初始化参数
CommonParam commonParam = new CommonParam();
commonParam.setEnvirment(CONST.Envirment.CHINA_PRO.url);
commonParam.setContext(MainActivity.this.getApplication());
commonParam.setAppId("…");//开发者自己的appid
commonParam.setAppSecret("…");//开发者自己的appsecret
//初始化添加模块
LCDeviceEngine.newInstance().init(commonParam);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
findViewById(R.id.tv_add).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
//调用设备添加接口
LCDeviceEngine.newInstance().addDevice(MainActivity.this);
} catch (Exception e) {
e.printStackTrace();
}
}
});
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 4. OpenSDK初始化
LCOpenSDK_Api是SDK内部与开放平台进行rest交互的封装类,应作为第一个调用的接口,在调用其他接口前进行初始化和设置参数。
初始化流程如下:
示例代码如下:
//初始化LCOpenSDK_Api
String token = "";//开发者自己去平台请求accessToken
String host = "openapi.lechange.cn:443";//host无需带协议类型
InitParams initParams = new InitParams(this, host, token);
try {
int iRet = LCOpenSDK_Api.initOpenApi(initParams);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
2
3
4
5
6
7
8
9
10
11
备注:OpenSDK初始化需要开发者先自行向开放平台获取Token:获取管理员token 或者 获取子用户token
# 5. 设置OpenSDK日志级别
通过调用LCOpenSDK_Utils.enableLogPrint()来开启或者关闭SDK内部日志打印
通过调用LCOpenSDK_Util.setLogLevel()来设置SDK日志级别:0:fatal 1:error 2:warning 3:info 4:debug
备注:在排查一些SDK内部问题时可以调整SDK日志级别完成问题复现与日志抓取,方便后续的问题定位和分析
# 6. 播放功能
SDK支持的播放类型主要有:实时预览、设备录像回放、云录像回放,都需要在使用SDK播放功能前,在布局文件中创建一个播放父窗口:
<!-- 播放窗口容器 -->
<FrameLayout
android:id="@+id/live_window"
android:layout_width="match_parent"
android:layout_height="200dp">
<!-- 渲染内容 -->
<FrameLayout
android:id="@+id/live_window_content"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
2
3
4
5
6
7
8
9
10
11
备注:SDK里完成播放功能的类采用继承FrameLayout的方式实现,所以需要一个父窗口容器。
初始化播放父窗口,计算出渲染内容FrameLayout的高度:
//初始化布局
FrameLayout fr_window = findViewById(R.id.live_window);
FrameLayout getFr_window_content = findViewById(R.id.live_window_content);
//以9:16的比例计算出fr_window的高度
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(fr_window.getLayoutParams());
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
layoutParams.width =metrics.widthPixels;//屏幕宽度
layoutParams.height = metrics.heightPixels*9/16;
layoutParams.setMargins(0, 0, 0, 0);
fr_window.setLayoutParams(layoutParams);
2
3
4
5
6
7
8
9
10
11
# 6.1 实时预览
实时预览的主要步骤有:
- 创建布局并初始化
- 初始化播放类LCOpenSDK_PlayRealWindow
- 给LCOpenSDK_ PlayRealWindow类添加事件监听和手势监听
- 获取播放参数playToken,非必须但是可以加速视频出流速度(开发者获取设备信息)
- 开始/停止播放
- 释放资源
预览流程为:
示例代码:
//初始化playWindow
LCOpenSDK_PlayRealWindow playWindow= new LCOpenSDK_PlayRealWindow();
playWindow.initPlayWindow(this, (ViewGroup) findViewById(R.id.live_window_content), 0, false);
//开发者实现事件监听并将监听设给playWindow
LCOpenSDK_EventListener listener = new LCOpenSDK_EventListener(){...}//开发者实现事件监听回调
playWindow.setWindowListener(listener);
//开启收拾监听
playWindow.openTouchListener();
/**
* 开始预览
* 1、准备预览参数
* 2、开启预览
* 3、在LCOpenSDK_EventListener回调中处理预览结果
* 4、停止预览
* 5、释放资源
*/
LCOpenSDK_ParamReal paramReal = new LCOpenSDK_ParamReal()
playWindow.playRtspReal(paramReal);
playWindow.stopRtspReal(true);
playWindow.uninitPlayWindow();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 6.2 设备录像回放
设备录像回放的主要步骤有:
- 创建布局并初始化(参考2.6)
- 初始化播放类LCOpenSDK_PlayBackWindow
- 给LCOpenSDK_ PlayBackWindow类添加事件监听和收拾监听
- 获取回放参数playToken,非必须但是可以加速视频出流速度(开发者获取设备录像信息)
- 开始/停止回放
- 释放资源
回放流程为:
示例代码:
//初始化playwindow
LCOpenSDK_PlayBackWindow playWindow= new LCOpenSDK_PlayBackWindow();
playWindow.initPlayWindow(this, (ViewGroup) findViewById(R.id.live_window_content), 0, true);
LCOpenSDK_EventListener listener = new LCOpenSDK_EventListener(){...}//开发者实现事件监听回调
playWindow.setWindowListener(listener);
//开启收拾监听
playWindow.openTouchListener();
/**
* 开始回放
* 1、准备回放参数
* 2、开启回放
* 3、在LCOpenSDK_EventListener回调中处理回放结果
* 4、停止回放
* 5、释放资源
*/
LCOpenSDK_ParamDeviceRecord paramDeviceRecord = new LCOpenSDK_ParamDeviceRecord(...);//开发者从录像列表中获取
playWindow.playRtspPlayback(paramDeviceRecord);
playWindow.stopRtspPlayback(true);
playWindow.uninitPlayWindow();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 6.3 云录像回放
云录像回放的主要步骤有:
- 创建布局并初始化(参考2.6)
- 初始化播放类LCOpenSDK_PlayBackWindow
- 给LCOpenSDK_PlayBackWindow类添加事件监听和收拾监听
- 获取回放参数playToken,非必须但是可以加速视频出流速度(开发者获取设备云录像信息)
- 开始/停止回放
- 释放资源
云录像回放流程为:
示例代码:
//初始化playwindow
LCOpenSDK_PlayBackWindow playWindow = new LCOpenSDK_PlayBackWindow();
playWindow.initPlayWindow(this, (ViewGroup) findViewById(R.id.live_window_content), 0, true);
//开发者实现事件监听并将监听设给playWindow
LCOpenSDK_EventListener listener = new LCOpenSDK_EventListener(){...}//开发者实现事件监听回调
playWindow.setWindowListener(listener);
//开启收拾监听
playWindow.openTouchListener();
/**
* 开始回放
* 1、准备回放参数
* 2、开启回放
* 3、在LCOpenSDK_EventListener回调中处理回放结果
* 4、停止回放
* 5、释放资源
*/
LCOpenSDK_ParamCloudRecord paramCloudRecord = new LCOpenSDK_ParamCloudRecord(...)//开发者从云录像列表中获取
playWindow.playCloud(paramCloudRecord);
playWindow.stopCloud(true);
playWindow.uninitPlayWindow();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
备注:
1、播放窗口监听回调类很重要,是上层与底层的直接回调交互类。
2、LCOpenSDK_EventListener类请参考OpenSDK接口文档。
# 7. 语音对讲功能
OpenSDK目前的对讲需要在成功开启预览的情况下才能对讲,对讲功能的主要步骤如下:
获取对讲参数
判断当前设备是否有对讲能力(设备能力集包含AudioTalk或AudioTalkV1)
为对讲设置监听
开始对讲
停止对讲
对讲流程为:
示例代码:
//关闭预览声音
playWindow.stopAudio();
//设置对讲监听
LCOpenSDK_Talk.setListener(new LCOpenSDK_TalkerListener());
//准备对讲参数(开发者获取当前正在预览的设备信息)
LCOpenSDK_ParamTalk paramTalk = new LCOpenSDK_ParamTalk(...);
//开始对讲
LCOpenSDK_Talk.playTalk(paramTalk);
//停止对讲
LCOpenSDK_Talk.stopTalk();
//释放对讲监听
LCOpenSDK_Talk.setListener(null);
//开启预览声音
playWindow.playAudio();
2
3
4
5
6
7
8
9
10
11
12
13
14
# 8. 下载功能
SDK支持的下载包括设备SD卡录像下载和云录像下载两种,下面分别介绍两种下载功能的流程。
# 8.1 设备本地录像下载
设备本地录像下载的主要步骤为:
获取设备本地录像片段列表
初始化设备本地录像下载参数
设置下载监听
开始下载
设备本地录像下载流程:
示例代码:
//获取设备录像列表(开发者自己请求获取)
//queryLocalRecords 查询设备录像记录
//设置下载监听(开发者重写LCOpenSDK_DownloadListener类方法)
LCOpenSDK_Download.setListener(new LCOpenSDK_DownloadListener());
//开始下载(开发者准备下载参数)
LCOpenSDK_Download.startDownload(...);
2
3
4
5
6
# 8.2 设备云录像下载
设备云录像下载的主要步骤为:
获取设备云录像片段列表
初始化设备云录像下载参数
设置下载监听
开始下载
设备云录像下载流程:
示例代码:
//获取云录像列表(开发者自己请求获取)
//queryCloudRecords 查询云录像记录
//设置下载监听(开发者重写LCOpenSDK_DownloadListener类方法)
LCOpenSDK_Download.setListener(new LCOpenSDK_DownloadListener());
//开始下载(开发者准备下载参数)
LCOpenSDK_Download.startDownload(...);
2
3
4
5
6
# 9. 设备数据解密
目前设备告警缩略图和录像封面图默认是加密存储的,需要解密后才能正常打开展示:使用SDK的LCOpenSDK_Utils.decryptPic方法来对加密图片数据进行解密操作。