我在android4.2上开发一个用usbhost通信的apk,为了支持可插拔,我用捕捉系统intent,但是发现,不是每次都能捕捉到intent;改为通过枚举设备号来检测设备的插拔状态,发现,当usbhost设备拔掉,却依然可以获取到pid和vid,也就是说系统认为设备还是attached状态,为什么会这样,或者有没有可以清楚设备信息的函数,是系统对设备的状态信息进行更新?
1条回答 默认 最新
- ChatGPTᴼᴾᴱᴺᴬᴵ 2023-03-19 19:12关注
该回答引用ChatGPT
这可能是由于USB主机控制器(Host Controller)的缓存导致的。USB主机控制器会维护一个设备列表,其中包括已经插入但尚未正确拔出的设备。这样做是为了加速USB设备的插入和拔出过程,因为USB设备插入时需要进行大量的初始化和协商,而这些操作可能需要一些时间。
如果您想要获取实时的USB设备状态,您可以尝试使用USB设备的事件通知(Event Notification)。您可以通过注册一个广播接收器(Broadcast Receiver)来接收USB设备事件通知。当USB设备插入或拔出时,系统会向广播接收器发送相应的USB设备事件通知。您可以在接收到USB设备事件通知后立即获取USB设备的状态信息。
以下是一个处理USB设备事件通知的示例代码:
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { // USB设备已经插入 UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); // 获取USB设备状态信息 int vendorId = device.getVendorId(); int productId = device.getProductId(); ... } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { // USB设备已经拔出 UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); // 获取USB设备状态信息 int vendorId = device.getVendorId(); int productId = device.getProductId(); ... } } }
您需要在AndroidManifest.xml文件中注册广播接收器,并为其添加必要的Intent过滤器:
<receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" /> </intent-filter> </receiver>
请注意,使用USB设备事件通知可能会对设备的电池寿命产生一定的影响,因为您需要在后台保持广播接收器处于活动状态。因此,请确保您只在必要时使用USB设备事件通知。
解决 无用评论 打赏 举报
悬赏问题
- ¥15 程序不包含适用于入口点的静态Main方法
- ¥15 素材场景中光线烘焙后灯光失效
- ¥15 请教一下各位,为什么我这个没有实现模拟点击
- ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
- ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
- ¥20 有关区间dp的问题求解
- ¥15 多电路系统共用电源的串扰问题
- ¥15 slam rangenet++配置
- ¥15 有没有研究水声通信方面的帮我改俩matlab代码
- ¥15 ubuntu子系统密码忘记