UPnP开发:如何实现已连接设备弹窗菜单及setConnectedDevice选中逻辑
现有代码错误修正
你当前写的列表项点击事件存在类型转换错误:你的SimpleAdapter数据源是List<Map<String, Object>>结构,所以parent.getItemAtPosition(position)返回的是对应位置的Map对象,无法直接强转为RemoteDevice,需要先提取Map里存储的Model字段,修正后的点击事件代码如下:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 先拿到对应位置的Map数据 Map<String, Object> itemMap = (Map<String, Object>) parent.getItemAtPosition(position); RemoteDevice choiceDevice = (RemoteDevice) itemMap.get("Model"); // 调用选中逻辑 ServiceManager.getInstance().setConnectedDevice(choiceDevice); // 选中后关闭弹窗 dialog.dismiss(); } });
setConnectedDevice 设备选中逻辑实现
你可以按以下步骤实现该方法的核心逻辑:
- 参数合法性校验:先判断传入的
choiceDevice是否为空、设备服务是否有效,避免无效参数导致后续崩溃 - 清理旧连接:如果之前已经有选中的连接设备,先销毁旧设备的UPnP服务回调、停止正在进行的投屏/传输任务、释放相关资源
- 存储新选中设备:在ServiceManager中声明全局变量存储当前选中的
RemoteDevice实例,可选做本地持久化缓存,下次进入App可直接读取上次选中的设备 - 初始化UPnP控制服务:从新选中的设备中提取你需要的控制服务,比如投屏场景常用的
AVTransport服务(控制播放、进度跳转)、RenderingControl服务(控制音量),并初始化服务的回调监听 - 状态通知:通过接口回调或者本地广播通知上层UI,更新设备选中状态,比如提示设备连接成功、更新投屏按钮的显示状态
- 异常处理:如果设备服务初始化失败,要回调错误状态,提示用户设备不支持对应功能、请重新选择
以下是ServiceManager中该方法的示例实现:
private RemoteDevice currentConnectedDevice; private IServiceConnectListener connectListener; // 自定义回调接口通知上层状态 public interface IServiceConnectListener { void onDeviceConnectSuccess(RemoteDevice device); void onDeviceConnectFail(String errorMsg); } public void setConnectedDevice(RemoteDevice choiceDevice) { // 1. 校验参数 if (choiceDevice == null || choiceDevice.getDetails() == null) { if (connectListener != null) { connectListener.onDeviceConnectFail("无效设备"); } return; } // 2. 清理旧设备资源 if (currentConnectedDevice != null) { // 停止旧的投屏任务、销毁服务回调 cancelPrevCastTask(); } // 3. 存储新设备 currentConnectedDevice = choiceDevice; // 4. 初始化UPnP服务,这里以获取AVTransport服务为例 Service avTransportService = choiceDevice.findService(UDN.valueOf("urn:schemas-upnp-org:service:AVTransport:1")); if (avTransportService == null) { currentConnectedDevice = null; if (connectListener != null) { connectListener.onDeviceConnectFail("设备不支持投屏功能"); } return; } // 初始化服务控制点、绑定回调 mControlPoint.bind(avTransportService, new ServiceBindCallback() { @Override public void onBindSuccess() { if (connectListener != null) { connectListener.onDeviceConnectSuccess(currentConnectedDevice); } } @Override public void onBindFailed(String error) { currentConnectedDevice = null; if (connectListener != null) { connectListener.onDeviceConnectFail("设备连接失败:" + error); } } }); }
内容的提问来源于stack exchange,提问作者RickyHero
相关产品推荐
相关产品推荐

