实现android 串口程序访问复合接口(USB 3.0 UVC+ACM ),请求打开失败

lv_geyan 2026-02-27 13:46:05
public TerminalFragment() {
        //广播接收器
        broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (INTENT_ACTION_GRANT_USB.equals(intent.getAction())) {
                    boolean granted = intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false);
                    UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

                    // 诊断信息:记录权限结果和设备信息
                    status("=== USB权限诊断开始 ===");
                    status("权限授予结果: " + granted);
                    status("请求的设备ID: " + deviceId);

                    // 如果 device 为 null,尝试通过 deviceId 重新查找
                    if (device == null) {
                        UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
                        for (UsbDevice d : usbManager.getDeviceList().values()) {
                            if (d.getDeviceId() == deviceId) {
                                status("  匹配到目标设备: " + d.getDeviceName());
                                device = d;
                                break;
                            }
                        }
                    }

                    // 处理权限结果
                    if (device != null) {
                        UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
                        boolean hasPermission = usbManager.hasPermission(device);
                        
                        if (granted || hasPermission) {
                            usbPermission = UsbPermission.Granted; // 标记为已授予
                            connect(); // 继续连接
                        } else {
                            // 权限被拒绝,提示用户
                            Toast.makeText(getActivity(), 
                                    "USB 权限被拒绝,请尝试重新插拔设备或在应用信息中清除数据", 
                                    Toast.LENGTH_LONG).show();
                            usbPermission = UsbPermission.Unknown; // 保持未知状态,允许再次尝试
                        }
                    } else {
                        // 找不到设备,提示用户
                        Toast.makeText(getActivity(), 
                                "找不到目标设备,请尝试重新插拔设备", 
                                Toast.LENGTH_LONG).show();
                        usbPermission = UsbPermission.Unknown; // 保持未知状态,允许再次尝试
                    }
                    status("=== USB权限诊断结束 ===");
                }
            }
        };
        mainLooper = new Handler(Looper.getMainLooper());
    }

 

...全文
568 3 打赏 收藏 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
AI向善 09-08 12:15
  • 打赏
  • 举报
回复

你问的是「社区 Android Android Studio 帖子详情 实现android 串口程序访问复合接」,我结合实操说几句。

先定位是哪一层的问题:环境/依赖、代码逻辑、还是模型/服务本身。RAG的坑大多集中在环境版本和配置。
几个针对你提到方向的具体点:
· RAG:先把『切分(chunk)策略 + 向量库召回 top-k + 重排(rerank)』三件套调顺,大部分效果问题出在切分粒度或没做重排,而不是模型本身。
建议的最小排查路径:① 用官方最小示例复现,确认基线能跑;② 逐步替换成你的代码/数据,每步可验证;③ 看日志里第一条报错往上溯源,别被后面的连锁报错带偏。
把报错信息和最小复现代码贴出来,能更快帮你 pinpoint。

以上是基于常见落地经验的判断,不一定全对。你那边具体是什么场景/报错?评论区说下,我帮你看。

AI向善 09-08 11:56
  • 打赏
  • 举报
回复

复合接口设备(UVC 摄像头加 ACM 串口挂在一个 USB device 下)在 Android 上打开失败,常见是这三处没处理好:

  1. USB 权限没拿到就开始操作。复合设备每个 UsbInterface 都要单独 claim。你代码里已经监听了 UsbManager.EXTRA_PERMISSION_GRANTED,但要确认是在 onReceive 拿到 granted=true 之后才去 openDevice / claimInterface,而不是 requestPermission 之后立刻操作——权限弹窗是异步的,没等回调就开就会失败。

  2. claim 的是不是对的 interface。用 device.getInterfaceCount() 遍历,按 getInterfaceClass() 区分:ACM 一般是 USB_CLASS_COMM(2) 配 USB_CLASS_CDC_DATA(10),UVC 是 USB_CLASS_VIDEO(14)。别只 claim 第 0 个接口,复合设备串口通常不在第一个。

  3. 用 UsbDeviceConnection 做 bulk 传输。拿到 interface 后 connection.claimInterface(iface, true),再用 connection.bulkTransfer(endpoint, buffer, length, timeout) 收发。注意 ACM 一般有两个 endpoint(IN/OUT),方向别接反,超时设个合理值(比如 1000ms)避免卡死。

调试建议:先把 device.getInterfaceCount() 和每个 interface 的 class/subclass 打印出来,确认你要的 ACM 接口 index;再单独写一个最小 demo 只开串口、不碰 UVC,能通了再合到你的 TerminalFragment 里。我们之前接类似设备时就是先拆分验证再合并,省了很多来回。

如果还是失败,把 claimInterface 的返回值和 logcat 里 UsbDeviceConnection 相关报错贴出来,能更准确定位。

lv_geyan 02-27 14:06
  • 打赏
  • 举报
回复

boolean granted = intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false); 该代码授权访问总是失败

80,490

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧