跳到主要内容

设备管理

更新时间:2025-07-02 14:54:22

包括设备绑定,设备解绑,设备列表

package com.polaris.iot.appsdk.libuserdevicemgr

object UserDeviceMgr {

/**
* 获取用户设备列表
* @param deviceListReq [DeviceListReq]
* @param iotCallback [IoTCallback]
*/
fun getDeviceList(deviceListReq: DeviceListReq, iotCallback: IoTCallback)

/**
* 获取设备详细
* 第三方可能用自己的设备列表,只有iotId,productKey,deviceName 需要请求数据用于后续业务开发
*/
fun getDeviceDetail(deviceList: List<DeviceInfo>, listener: OnResultListener<List<DeviceInfo>>)

/**
* 获取网关设备子设备列表
*
* @param childListReq [DeviceChildListReq]
* @param iotCallback [IoTCallback]
*/
@JvmStatic
fun getChildDeviceList(childListReq: DeviceChildListReq, iotCallback: IoTCallback)

/**
* 修改设备昵称
*@param iotId 设备的唯一标识符。
*@param nickName 设备的昵称或别名。
*@param iotCallback [IoTCallback]。
*/
fun setDeviceNickname(iotId: String, nickName: String, iotCallback: IoTCallback)


/**
* 设备解绑
* @param iotId iotId 平台为设备颁发的ID,设备的唯一标识符。
* @param iotCallback [IoTCallback]
*/
fun deviceUnbind(iotId : String, iotCallback: IoTCallback)

}

设备绑定

总体介绍参考设备绑定开发指南

设备绑定模式因设备差异分为以下几种:

/**
* 设备绑定模式
*
*/
enum class DeviceBindModeEnum {
/**
* App获取bindToken传递给设备 默认
*/
BIND_TOKEN,

/**
* 扫码激活绑定 APP扫设备机身二维码快速绑定 (有网设备,如4G设备,插网线设备,或带屏可自行连网设备)
*/
SCAN_QUICK_ACTIVE,
}
注意
  • 设备绑定详细流程说明请点击
  • 用户绑定设备,开始与结束需要匹配调用。绑定流程调用start开始后,退出绑定流程必须调用stop
  • app自行控制绑定流程超时,超时后请调用stop结束绑定流程
object UserDeviceAdd {
/**
* 绑定设备匹配随机数,通过配网途径传递给设备 只读
* 仅当绑定状态变为DeviceAddStatus.STARTED后有值
*/
@JvmStatic
val bindToken: String

/**
* 设置绑定模式 废弃,请使用 prepare 替代
*/
@Deprecate
@JvmStatic
fun setBindMode(bindMode: DeviceBindModeEnum)

/**
* 准备绑定 设置绑定模式
*
* @param bindMode
*/
@JvmStatic
fun prepare(bindMode: DeviceBindModeEnum)

/**
* 设置监听,重复设置后设置会覆盖前设置
* @param listener [OnDeviceAddListener] 绑定流程状态监听
*/
@JvmStatic
fun setOnDeviceAddListener(listener: OnDeviceAddListener)
/**
* 开始绑定
*/
@JvmStatic
fun start()

/**
* 开始绑定 传入productKey与deviceName多一次校验更安全
* @param productKey 产品型号 可传空字串
* @param deviceName 产品序列号 可传空字串
*/
@JvmStatic
fun start(productKey: String?, deviceName: String?)

/**
* 开始绑定
* @param listener [OnDeviceAddListener] 绑定流程状态监听
*/
@JvmStatic
fun start(listener: OnDeviceAddListener)

/**
* 开始绑定 传入productKey与deviceName多一次校验更安全
* @param productKey 产品型号 可传空字串
* @param deviceName 产品序列号 可传空字串
* @param listener [OnDeviceAddListener] 绑定流程状态监听
*/
@JvmStatic
fun start(productKey: String, deviceName: String, listener: OnDeviceAddListener)

/**
* 停止绑定,与[start]匹配调用
*/
@JvmStatic
fun stop()
}

绑定模式

  • BIND_TOKEN 模式
注意
  • 关于设备配网

​ 配网流程需要app自行实现,app将wifi信息传递给设备。常见通信方式:

  1. 设备扫描app生成的二维码
  2. 蓝牙
  3. AP连接
  4. 局域网广播等
  • 关于绑定流程
  1. 调start方法,绑定状态变为STARTED时获取bindToken (每次start都返回新的bindToken,有效时长30分钟)
  2. 将bindToken通过支持的通信方式传递给设备,设备在配网成功,保证网络连通情况下,通过DeviceSDK进行设备绑定
    • 海外绑定设备另需将IoTSmart.getRegionId()一起传递给设备,SDK版本要求:v1.4.1
  3. App只监听设备绑定是否成功的回调(超时自行控制,最大超时依赖bindToken的有效时长)超时后请务必调用停止绑定接口stop

示例一

import com.polaris.iot.appsdk.libcommon.constants.IoTSDKError
import com.polaris.iot.appsdk.libcommon.log.IoTLogger
import com.polaris.iot.appsdk.libcommon.utils.JsonUtils
import com.polaris.iot.appsdk.libuserdevicemgr.OnDeviceAddListener
import com.polaris.iot.appsdk.libuserdevicemgr.UserDeviceAdd
import com.polaris.iot.appsdk.libuserdevicemgr.enums.DeviceAddStatus
import com.polaris.iot.appsdk.libuserdevicemgr.enums.DeviceBindModeEnum

//准备绑定 传入绑定模式
UserDeviceAdd.prepare(DeviceBindModeEnum.BIND_TOKEN) //setBindMode废弃
//开始绑定流程
UserDeviceAdd.start(productKey,deviceName,new OnDeviceAddListener() {
@override
public void onDeviceAddStatus(status: DeviceAddStatus,exception: IoTSDKError) {
//监听绑定状态
switch(status){
case DeviceAddStatus.STARTED:
//获取设备配网绑定随机数(有效时长30分钟),传递给设备
//比如二维码配网,配网随机数需要填入二维码信息中供设备识别获取
String bindToken = UserDeviceAdd.getBindToken();
//接入区域为海外时需要获取regionId,同bindToken一起传递给设备, 需要SDK版本v1.4.1
//接入区域为中国大陆可不需要regionId
String regionId = IoTSmart.getRegionId()
break;

case DeviceAddStatus.SUCCESS:
JSONObject payload = JsonUtils.parseJson(exception.getMessage())
if(payload != null){
// 设备id
String iotId = payload.getString("iotId")
//如果没有先扫设备机身二维码获取到prodcutKey和deviceName 可从绑定结果中获取
String productKey = payload.getString("productKey")
String deviceName = payload.getString("deviceName")
}
//成功处理
UserDeviceAdd.stop();
break;
case DeviceAddStatus.FAILED:
//失败处理
UserDeviceAdd.stop();
break;
}
})

示例二

import com.polaris.iot.appsdk.libcommon.constants.IoTSDKError
import com.polaris.iot.appsdk.libcommon.log.IoTLogger
import com.polaris.iot.appsdk.libcommon.utils.JsonUtils
import com.polaris.iot.appsdk.libuserdevicemgr.OnDeviceAddListener
import com.polaris.iot.appsdk.libuserdevicemgr.UserDeviceAdd
import com.polaris.iot.appsdk.libuserdevicemgr.enums.DeviceAddStatus
import com.polaris.iot.appsdk.libuserdevicemgr.enums.DeviceBindModeEnum

//准备绑定 传入绑定模式
UserDeviceAdd.prepare(DeviceBindModeEnum.BIND_TOKEN) //setBindMode废弃
//监听器
OnDeviceAddListener listener = new OnDeviceAddListener() {
@override
public void onDeviceAddStatus(status: DeviceAddStatus,exception: IoTSDKError) {
//监听绑定状态
switch(status){
case DeviceAddStatus.STARTED:
//获取设备配网绑定随机数(有效时长30分钟),传递给设备
//比如二维码配网,配网随机数需要填入二维码信息中供设备识别获取
String bindToken = UserDeviceAdd.getBindToken();
//接入区域为海外时需要获取regionId,同bindToken一起传递给设备, 需要SDK版本v1.4.1
//接入区域为中国大陆可不需要regionId
String regionId = IoTSmart.getRegionId()
break;

case DeviceAddStatus.SUCCESS:
JSONObject payload = JsonUtils.parseJson(exception.getMessage())
if(payload != null){
// 设备id
String iotId = payload.getString("iotId")
//如果没有先扫设备机身二维码获取到prodcutKey和deviceName 可从绑定结果中获取
String productKey = payload.getString("productKey")
String deviceName = payload.getString("deviceName")
}
//成功处理 结束绑定流程
UserDeviceAdd.stop();
break;
case DeviceAddStatus.FAILED:
//失败处理 结束绑定流程
UserDeviceAdd.stop();
break;
}
}
//请及时设置设置监听
UserDeviceAdd.setOnDeviceAddListener(listener)

//开始绑定流程
UserDeviceAdd.start(productKey,deviceName,)
  • SCAN_QUICK_ACTIVE模式

    APP扫机身二维码获取设备信息进行激活绑定

信息

主要适用以下几类设备:

  • GPRS / 3G / 4G 等蜂窝网络设备
  • 可在屏幕上输入 Wi-Fi 密码的带屏类无线设备,如云相框
  • 有线设备

以上这几种设备都有一个共同点,设备在不用 App 参与的情况下自身就可以连接互联网

示例

import com.polaris.iot.appsdk.libcommon.constants.IoTSDKError
import com.polaris.iot.appsdk.libcommon.log.IoTLogger
import com.polaris.iot.appsdk.libcommon.utils.JsonUtils
import com.polaris.iot.appsdk.libuserdevicemgr.OnDeviceAddListener
import com.polaris.iot.appsdk.libuserdevicemgr.UserDeviceAdd
import com.polaris.iot.appsdk.libuserdevicemgr.enums.DeviceAddStatus
import com.polaris.iot.appsdk.libuserdevicemgr.enums.DeviceBindModeEnum
import com.alibaba.fastjson.JSONObject

//准备绑定 传入绑定模式
UserDeviceAdd.prepare(DeviceBindModeEnum.SCAN_QUICK_ACTIVE) //setBindMode废弃
//开始绑定流程
UserDeviceAdd.start(productKey,deviceName,new OnDeviceAddListener() {
@override
public void onDeviceAddStatus(status: DeviceAddStatus,exception: IoTSDKError) {
//监听绑定状态
switch(status){
case DeviceAddStatus.SUCCESS:
JSONObject payload = JsonUtils.parseJson(exception.getMessage())
if(payload != null){
// 设备id
String iotId = payload.getString("iotId")
}
//成功处理 结束绑定流程
UserDeviceAdd.stop();
break;
case DeviceAddStatus.FAILED:
//失败处理 结束绑定流程
UserDeviceAdd.stop();
break;
}
})

结束绑定

  1. 收到绑定结果状态后调用
  2. 在用户退出绑定流程时调用
  3. 上层控制超时时调用

UserDeviceAdd.stop();

绑定成功

收到绑定成功后,可以从exception中message里取到携带的iotId信息, message为一个JSON格式字符串

详见绑定示例

绑定失败

  • 绑定超时由app层自行控制

  • 失败 IoTSDKError

    codemessage备注
    31065{"account":"13800138000","bindTime":1749175876000}被其它用户绑定
    31068设备不在线
    31069设备已绑定未重置
    31499给设备发送信令失败

设备解绑

import com.polaris.iot.appsdk.libcommon.constants.IoTSDKError
import com.polaris.iot.appsdk.libcommon.log.IoTLogger
import com.polaris.iot.appsdk.libcommon.utils.JsonUtils
import com.polaris.iot.appsdk.libuserdevicemgr.UserDeviceMgr
import com.polaris.iot.appsdk.libuserdevicemgr.model.DeviceUnbindReq;
import com.polaris.iot.appsdk.libapiclient.callback.IoTCallback;
import com.polaris.iot.appsdk.libapiclient.callback.IoTResponse;
import com.polaris.iot.appsdk.libapiclient.request.IoTRequest;


UserDeviceMgr.deviceUnbind(new DeviceUnbindReq(deviceInfo.getIotId()), new IoTCallback() {
@Override
public void onFailure(@Nullable IoTRequest request, @NonNull IoTSDKError exception) {
Toast.makeText(DeviceListActivity.this, "删除设备[" + deviceInfo.getDeviceName() + "]失败", Toast.LENGTH_SHORT).show();
}

@Override
public void onResponse(@NonNull IoTRequest request, @NonNull IoTResponse response) {
Toast.makeText(DeviceListActivity.this, "删除设备[" + deviceInfo.getDeviceName() + "]成功", Toast.LENGTH_SHORT).show();
getDeviceList();
}
});

设备列表

import com.polaris.iot.appsdk.libuserdevicemgr.UserDeviceMgr;
import com.polaris.iot.appsdk.libuserdevicemgr.model.DeviceInfo;
import com.polaris.iot.appsdk.libuserdevicemgr.model.DeviceListReq;
import com.polaris.iot.appsdk.libuserdevicemgr.model.DeviceListResp;
import com.polaris.iot.appsdk.libapiclient.callback.IoTCallback;
import com.polaris.iot.appsdk.libapiclient.callback.IoTResponse;
import com.polaris.iot.appsdk.libapiclient.request.IoTRequest;

UserDeviceMgr.getDeviceList(new DeviceListReq(1, 20, null), new IoTCallback() {
@Override
public void onFailure(@Nullable IoTRequest request, @NonNull IoTSDKError exception) {
Toast.makeText(DeviceListActivity.this, "获取设备列表失败", Toast.LENGTH_SHORT).show();

}

@Override
public void onResponse(@NonNull IoTRequest request, @NonNull IoTResponse response) {
DeviceListResp deviceListResp = (DeviceListResp) response.getData();

List<DeviceInfo> deviceList = deviceListResp.getData();
}
});

设备信息

/**
* Device info
*
* @property iotId 平台为设备颁发的ID,设备的唯一标识符。
* @property deviceName 设备序列号
* @property productKey 产品型号唯一值
* @property status 设备状态。0(表示未激活);1(表示在线);2(休眠) 3(表示离线);8(表示禁用)。
* @property owned 设备和用户的关系,可取值:0(表示分享者),1(表示拥有者)。
* @property gmtModified 绑定设备的时间
* @property nodeType 设备的节点类型,可取值包括:DEVICE,GATEWAY。
* @property thingType 类型: DEVICE:普通设备
* @property region 设备当前所在的机房
* @property identityId 用户的身份ID。
* @property productName 设备所属产品的型号名称。
* @property productModel 设备所属产品的型号。
* @property nickName 设备昵称
* @property netType 产品下设备的联网方式,可取值: NET_LORA(表示LoRa);NET_CELLULAR(表示2G/3G/4G/5G蜂窝网);NET_WIFI(表示Wi-Fi);NET_ZIGBEE(表示ZigBee);NET_ETHERNET(表示以太网);NET_OTHER(表示其他网络类型)。
* @property groupId 设备分组ID 可选
* @property sharePermissionList 只有owned=0有值,分享权限列表,live:直播,control:设备控制,record:录像回看,ptz:云台控制,voiceIntercom:语音对讲,setting:高级设置,notification:消息通知
* @constructor Create empty Device info
*/
open class DeviceInfo(
iotId: String,
productKey: String,
deviceName: String,
var status: Int,
val owned: String,
val gmtModified: Long,
var region: String?,
val identityId: Long?,
val productName: String?,
val productModel: String?,
var nickName: String?,
val netType: String?,
val groupId: Long?,
val sharePermissionList: List<String>? = null
)

设备详细

当不使用SDK中的设备列表,需要获取设备详细以正常使用后续播放等

List<XXXDeviceInfo> thirdDeviceList //接入方自有设备列表 需要有iotId productKey deviceName
List<DeviceInfo> list = thirdDeviceList.stream().map(it->new DeviceInfo(it.getIotId(),it.getProductKey(),it.getDeviceName()))
.collect(Collectors.toList());

UserDeviceMgr.getDeviceDetail(list, new OnResultListener<List<DeviceInfo>>() {
@Override
public void onResult(List<DeviceInfo> result) {
onDeviceListResp(result);
//播放等操作
}

@Override
public void onError(@NonNull IoTSDKError error) {

}
});

网关设备子设备

获取网关设备子设备列表

import com.polaris.iot.appsdk.libuserdevicemgr.UserDeviceMgr;
import com.polaris.iot.appsdk.libuserdevicemgr.model.DeviceInfo;
import com.polaris.iot.appsdk.libuserdevicemgr.model.DeviceChildListReq;
import com.polaris.iot.appsdk.libuserdevicemgr.model.DeviceListResp;
import com.polaris.iot.appsdk.libapiclient.callback.IoTCallback;
import com.polaris.iot.appsdk.libapiclient.callback.IoTResponse;
import com.polaris.iot.appsdk.libapiclient.request.IoTRequest;

private DeviceInfo mDeviceInfo;
private void getDeviceList() {

RecyclerView rvDeviceList = binding.rvDeviceList;
TextView tvNoDeviceTip = binding.tvNoDeviceTip;
long reqStartTime = System.currentTimeMillis();
UserDeviceMgr.getChildDeviceList(new DeviceChildListReq(mDeviceInfo), new IoTCallback() {
@Override
public void onFailure(@Nullable IoTRequest request, @NonNull IoTSDKError exception) {

}

@Override
public void onResponse(@NonNull IoTRequest request, @NonNull IoTResponse response) {
DeviceListResp rsp = (DeviceListResp) response.getData();
if (rsp == null) return;
List<DeviceInfo> deviceList = rsp.getData();
}
});
}

修改设备昵称

String iotId= "设备ID";
String nickName= "名称";
UserDeviceMgr.setDeviceNickname(iotId, nickName, new IoTCallback() {
@Override
public void onFailure(@Nullable IoTRequest request, @NonNull IoTSDKError exception) {
showToast("修改设备昵称失败");
}

@Override
public void onResponse(@NonNull IoTRequest request, @NonNull IoTResponse response) {
showToast("修改设备昵称成功");
}
});

设备缩略图

使用场景:设备列表展示界面,当设备处于列表可见区域时调用

package com.polaris.iot.appsdk.libuserdevicemgr
/**
* 设备缩略图管理
*/
object DeviceThumbnailMgr{
/**
* 获取设备直播缩略图
*
* @param deviceInfo [DeviceInfo]设备信息,设备列表获取
* @param listener 获取结果监听
*/
@JvmStatic
fun getLiveThumbnail(deviceInfo: DeviceInfo, listener: OnResultListener<ThumbnailInfo>)
}

示例

import com.polaris.iot.appsdk.libuserdevicemgr.model.ThumbnailInfo
DeviceInfo deviceInfo;
DeviceThumbnailMgr.getLiveThumbnail(deviceInfo, new OnResultListener<>() {
@Override
public void onError(@NonNull IoTSDKError error) {

}

@Override
public void onResult(ThumbnailInfo result) {
if (!holder.ivDeviceImg.getTag().equals(result.getIotId())) {
return;
}
runOnUiThread(() -> {
Glide.with(DeviceListActivity.this).load(result.getDownloadUrl())
.placeholder(holder.ivDeviceImg.getDrawable())
.error(R.drawable.device_default)
.into(holder.ivDeviceImg);
});
}
});

设备配置

com.polaris.iot.appsdk.libuserdevicemgr.DeviceEntityMgr

配置项 DeviceEntityEnum

package com.polaris.iot.appsdk.libuserdevicemgr.enums
enum class DeviceEntityEnum{
/**
*消息推送设置
*/
MSG_PUSH_SETTING
}

消息通知计划

/**
* 推送计划
*
* @property start 开始时间,utc时间,秒
* @property end 结束时间,utc时间,秒 (end时间应始终大于start时间,跨天的时候,end为第二天的时间)
* @property wk 对应的值仅在"rpt"为2时有效,存在重复设置值:SUN:0x0001, MON:0x0002, TUE:0x0004, WED:0x0008, THU:0x0010, FRI:0x0020, SATU:0x0040,支持按位或操作
* @property rpt 重复类型,0:执行一次 1:每天重复 2:每周重复 3:每月重复 (目前支持1和2)
* @property sta 推送关闭计划状态 1表示状态开,0表示状态关
*/
data class MsgPushSettingSchedule(
var start: Int,
var end: Int,
var wk: Int,
var rpt: Int = 2,
var sta: Int = 1,
) : Serializable {
constructor(start: Int, end: Int, wk: Int) : this(start, end, wk, 2, 1)
}

/**
* 推送设置
*
* @property sch 推送关闭计划列表
* @property sta 是否接收推送消息
* @property img 是否推送图片
* @property interval 推送间隔 单位:秒 0不限
*/
data class MsgPushSetting(
var sch: List<MsgPushSettingSchedule> = listOf(),
var sta: Int = 1,
var img: Int = 0
) : Serializable {
//版本要求:v1.4.1
var interval: Int = 0
}

获取设备配置

/**
* 获指定配置项
*
* @param iotId 设备ID
* @param entityEnum 配置项
* @param listener 回调
*/
@JvmStatic
fun getDeviceEntity(iotId: String, entityEnum: DeviceEntityEnum, listener: OnResultListener<String?>)

示例

DeviceEntityMgr.getDeviceEntity(mIotId, DeviceEntityEnum.MSG_PUSH_SETTING, new OnResultListener<String>() {
@Override
public void onResult(String result) {
mMsgNotifySetting = JsonUtils.parseJson(result, MsgPushSetting.class);
initSettingView();
hideLoading();
}

@Override
public void onError(@NonNull IoTSDKError error) {
initSettingView();
hideLoading();
}
});

设置设备配置

/**
* 设置设备配置项
*
* @param iotId 设备ID
* @param entityEnum 设置项
* @param value 设置内容
* @param ioTCallback 回调
*/
@JvmStatic
fun setDeviceEntity(iotId: String, entityEnum: DeviceEntityEnum, value: String, ioTCallback: IoTCallback?)

示例

DeviceEntityMgr.setDeviceEntity(
mIotId,
DeviceEntityEnum.MSG_PUSH_SETTING,
JsonUtils.toJsonString(mMsgNotifySetting),
new IoTCallback() {
@Override
public void onFailure(@Nullable IoTRequest request, @NonNull IoTSDKError exception) {
showToast(R.string.error_api_failed);
finish();
}

@Override
public void onResponse(@NonNull IoTRequest request, @NonNull IoTResponse response) {
finish();
}
});

云台预置位

收藏常看的云台位置,方便快速转动设备镜头至相应位置

class PTZPresetMgr(private val mIotId: String) {
/**
* 获取设备预置位列表
*
* @param onResultListener [OnResultListener]<List<[PTZPresetRspItem]>>
*/
fun getPresetList(onResultListener: OnResultListener<List<PTZPresetRspItem>>)

/**
* 添加预置位
*
* @param reqParams [PTZPresetReq]
* @param onResultListener [OnResultListener]<[PTZPresetRspItem]>
*/
fun addPreset(reqParams: PTZPresetReq, onResultListener: OnResultListener<PTZPresetRspItem>)

/**
* 删除预置位
*
* @param item 列表返回的预置位项[PTZPresetRspItem]
* @param onResultListener [OnResultListener]<Boolean>
*/
fun removePreset(item: PTZPresetRspItem, onResultListener: OnResultListener<Boolean>)

/**
* 更新预置位名称 如果ptz信息或图片变化请删除重新添加
*
* @param item 列表返回的预置位项[PTZPresetRspItem]
* @param onResultListener [OnResultListener]<Boolean>
*/
fun updatePreset(item: PTZPresetRspItem, onResultListener: OnResultListener<Boolean>)
}

构建对象

private var mPTZPresetMgr: PTZPresetMgr? = null
val iotId = "设备ID"
mPtzPresetMgr = PTZPresetMgr(iotId)

获取设备预置位列表


mPtzPresetMgr.getPresetList(object : OnResultListener<List<PTZPresetRspItem>> {
override fun onResult(result: List<PTZPresetRspItem>) {
IoTLogger.d(TAG, "getPresetList result=${JsonUtils.toJsonString(result)}")
mPresetListAdapter?.setDataList(result)
}

override fun onError(error: IoTSDKError) {
}
})

PTZPresetRspItem

/**
* 预置位列表项
*
* @property ptz 预置位信息
* @property name 预置位名称
* @property picId 预置位图片ID
* @property picUrl 预置位图片地址
* @constructor Create empty P t z preset rsp item
*/
data class PTZPresetRspItem(
val ptz: String,
var name: String?,
val picId: String?,
val picUrl: String?,
)

添加预置位

  1. 通过物模型或其它途径获取设备当前云台位置信息

  2. 用户输入位置名称

  3. 获取设备当前位置画面(可截图播放器当前直播画面)

val ptzPosition = "获取到的当前云台位置信息"
val name="常看位置"
val bitmap: Bitmap? = null //当前画面,可从播放器截图

val onResultListener = object : OnResultListener<PTZPresetRspItem> {
override fun onResult(result: PTZPresetRspItem) {
binding.popPresetListView.addListItem(result)
hideLoading()
}

override fun onError(error: IoTSDKError) {
IoTLogger.e(TAG, "error", error)
hideLoading()
showToast(R.string.operate_failed)
}
}
mPTZPresetMgr?.addPreset(PTZPresetReq(ptzPosition, name, bitmap), onResultListener)

PTZPresetReq

/**
* 预置位保存参数 预置位名称与截图至少有一个
*
* @property ptz 预置位信息
* @property name 预置位名称 可选
* @property bitmap 预置位截图 可选
* @constructor Create empty P t z preset req
*/
data class PTZPresetReq(
var ptz: String,
var name: String?,
var bitmap: Bitmap?,
) {
constructor(ptz: String, name: String) : this(ptz, name, null)
constructor(ptz: String, bitmap: Bitmap) : this(ptz, null, bitmap)
}

删除预置位

传入列表中获取数据,删除指定预置位

private fun doRemovePreset(data: PTZPresetRspItem, pos: Int) {
mPTZPresetMgr.removePreset(data, object : OnResultListener<Boolean> {
override fun onResult(result: Boolean) {
removeItemAt(pos)
}

override fun onError(error: IoTSDKError) {
Toast.makeText(mContext, mContext.getString(R.string.operate_failed) + "[${error.getCode()}]", Toast.LENGTH_SHORT).show()
}
})
}

修改预置位名称

更新预置位名称 如果ptz信息或图片变化请删除重新添加

val item: PTZPresetRspItem = getItem(0)

item.name = "新的位置名称"

mPTZPresetMgr.updatePreset(item, object : OnResultListener<Boolean> {
@SuppressLint("NotifyDataSetChanged")
override fun onResult(result: Boolean) {
if (result) {
notifyDataSetChanged()
} else {
item.name = oldValue
Toast.makeText(mContext, mContext.getString(R.string.operate_failed), Toast.LENGTH_SHORT).show()
}
}

override fun onError(error: IoTSDKError) {
item.name = oldValue
Toast.makeText(mContext, mContext.getString(R.string.operate_failed) + "[${error.getCode()}]", Toast.LENGTH_SHORT).show()

}
})