You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:15:03