示例工程
示例工程
Android 标准化 Demo 基于 OpenSDK 组件,实现乐橙云开放平台音视频相关的核心功能。建议阅读 Demo 源代码,作为参考或移植到自己的项目,有助于快速集成。下载见 资源下载 的 Android Demo 行。
由于 Demo 没有后台 SaaS 服务,Demo 直接在客户端请求开放平台接口来获取数据以及其他操作。建议涉及调用乐橙开放平台 OpenAPI 的地方,由开发者后台 SaaS 去调用,再将数据返回给客户端 App,整体系统架构采用云云对接。调用接口需要 appId 和 appSecret。如果放在客户端代码中实现,客户端被反编译后,存在 appId 和 appSecret 被盗用的风险。
步骤
按本页后续各节操作。
功能
- 管理员模式登录:获取 accessToken,作为接下来每个 API 接口和 SDK 方法的必传参数。
- 获取设备列表:分别获取开放平台绑定和乐橙 App 绑定的设备。
- 设备详情:设备解绑、布防设置、设备升级、网络配置等。
- 实时预览:视频播放、语音对讲、抓图、本地录制等。
- 录像回放:录像下载,云录像/设备录像回放、倍速播放等。
- 设备添加已封装成单独模块,供直接使用。
| 技术术语 | 说明 |
|---|---|
| 管理员模式 | 使用在开放平台注册得到的 AppId 和 AppSecret 换取 accessToken,类似于账号登录的概念 |
| 设备列表获取 | 通过开发者账号请求 设备查询 相关接口,从乐橙云开放平台获取开发者账号下的设备列表清单 |
| 实时预览、本地录制/抓图 | 实时预览指在客户端获取设备的实时码流,并进行解码和显示。本地录制指在实时预览过程中,将预览流存储为本地视频文件,支持 MP4。本地抓图指在实时预览过程中,将当前预览画面存储为本地图片,图片为 JPG |
| 设备录像回放 | 在客户端上获取设备里的 SD 卡存储的录像文件流,并进行解码和显示 |
| 语音对讲 | 客户端与设备进行对讲通话,目前支持双向语音对讲 |
| 云录像回放 | 客户端获取设备存储在云端的录像,并进行解码和显示 |
| 动检开关 | 设备检测到移动时是否产生报警消息和录像的开关 |
| 云台(PTZ) | 通过终端(如 App)控制操作设备 |
| OpenApi | 客户端与乐橙平台交互的接口,RESTful API |
工程结构
解压后的目录:
DeviceAddModule:设备添加模块DeviceDetailModule:设备详情模块MediaModule:媒体模块MessageModule:消息模块mobilecommon:公共模块PlaybackModule:录像模块(与settings.gradle模块名一致)thrid-zxing:设备添加模块的依赖模块,主要用于添加设备时相机扫码(读取设备上的二维码并解析)usermodule:用户模块app:Demo 源码,依赖DeviceAddModule
代码位置
在获取管理员设备列表以及进行设备操作前,需要获取 accessToken(管理员 token)。获取 accessToken 的过程叫做管理员账号模拟登录,获取之后直接进入设备列表。com.mm.android.mobilecommon.openapi.TokenHelper.java 的 getToken 已实现该接口。
设备列表在 com.lechange.demo.ui.DeviceListActivity.java 的 deviceList。实时预览页见 DeviceOnlineMediaPlayActivityNew.java,支持横屏和竖屏,还包含对讲、云台、抓图/录制。设备号、通道号、播放码在获取设备详细列表时即可获取到;码流类型默认为高清码流,0 为高清码流,1 为标清码流。
云台见 DeviceInfoOpenApiManager.java 的 controlMovePTZ。购买云存储套餐后可以查看云录像,见同文件 getCloudRecords。设备拥有 TF 卡后可以查看设备录像,见 queryLocalRecords。Demo 会保存退出实时预览页面之前的最后一帧画面,保存在本地数据库和 SD 卡,作为设备列表页和预览页面的默认图片,见 DeviceLocalCacheManager.java 和 DeviceLocalCacheDatabase.java。
当设备程序有更新时,可通过 OpenAPI 给设备升级,见 DeviceInfoOpenApiManager.java 的 upgradeDevice。重命名见 modifyDeviceName,布防见 modifyDeviceAlarmStatus,解绑见 unBindDevice,本地存储见 getDeviceStoreInfo、deviceSdcardStatus,云存储见 setAllStorageStrategy。当设备在线时,可以查询设备当前连接的 Wi-Fi 以及周边 Wi-Fi,并切换 Wi-Fi,见 DeviceAddOpenApiManager.java 的 currentDeviceWifi、wifiAround、controlDeviceWifi。
录像播放页见 DeviceRecordPlayActivityNew.java。云录像包含播放/暂停、下载、倍速、抓图、录制;设备录像包含播放/暂停、抓图、录制。这些功能调用 SDK 方法。
设备添加组件
把 DeviceAddModule 导入工程:Android Studio 菜单 File → New → Import Module,选择 Demo 工程中 DeviceAddModule 所在路径,Finish 完成导入。
在自己工程 app 目录的 build 文件中:
//高版本Android Stduio
api project(':usermodule')
api project(':MediaModule')
api project(':PlaybackModule')
api project(':MessageModule')
api project(':DeviceDetailModule')
//或低版本Android Stduio
compile project(':usermodule')
compile project(':MediaModule')
compile project(':PlaybackModule')
compile project(':MessageModule')
compile project(':DeviceDetailModule')
若编译报 Manifest merger failed with multiple errors, see logs,在 AndroidManifest.xml 的 application 节点加入 tools:replace="android:allowBackup,android:label,android:supportsRtl"。
若 targetSdkVersion >= 29,在 application 节点加入 android:requestLegacyExternalStorage="true"。
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:requestLegacyExternalStorage="true"
tools:replace="android:allowBackup,android:label,android:supportsRtl"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
设备添加模块目前以源码形式提供。集成后如需混淆,keep 规则见本页上文「设备添加组件」依赖列表,或 标准化 Demo — 设备添加组件(与 Demo 工程 proguard-rules.pro 对齐)。
初始化设备添加模块之后再调用添加。init 会包含 LCOpenSDK_Api 的 setHost(),因此不必再次调用 setHost()。初始化失败(如获取 token 失败)会在异常里返回 Throwable。addDevice 须在 init 成功之后调用。
try {
CommonParam commonParam = new CommonParam();
//(必传) 传入开放平台的域名(含端口),国内一般为:https://openapi.lechange.cn:443,海外一般为:https://openapi.easy4ip.com:443
commonParam.setEnvirment(CONST.Envirment.CHINA_PRO.url);
//(必传) Android的Application对象
commonParam.setContext(EnvGuideActivity.this.getApplication());
//(必传) 应用Id(乐橙开放平台注册获取)
commonParam.setAppId("请替换成自己的appId");
// Demo 源码还会调用 setAppSecret。生产应用不要把 AppSecret 放进客户端或提交到仓库。
// 由服务端持有 AppSecret,客户端只使用服务端下发的 accessToken 或播放地址。
//(非必传) 用户唯一id,默认appId
commonParam.setUserId("");
LCDeviceEngine.newInstance().init(commonParam);
} catch (Throwable e) {
// Demo 可简化;集成时请 log 或提示(常见为 token/网络失败)
}
try {
LCDeviceEngine.newInstance().addDevice(this);
} catch (Exception e) {
// 须在 init 成功之后调用;失败时排查权限与模块依赖
}
设备添加模块的 AndroidManifest.xml 已经默认开启乐橙 SDK 所需的全部权限,集成后无需再开启,具体权限见该模块中的 AndroidManifest.xml。LCDeviceEngine 的 init 包含 LCOpenSDK_Api.setHost,使用该模块后无需再次调用 setHost。
模块目前提供的源码不支持 AndroidX。若项目使用 AndroidX:方式一,按 Android 官方迁移指南 在 Android Studio 中迁移;方式二,将设备添加模块打包为 aar 后引入工程。