0

是否可以以编程方式检测我的设备是否断开连接(USB)?

我正在尝试在我的附件模式应用程序中标记断开连接事件。那么有可能吗?如果是,如何?

4

3 回答 3

0

您可能无法使用UsbManager.ACTION_USB_DEVICE_ATTACH或仅支持托管 USB 连接的 Android UsbManagerACTION_USB_DEVICE_DETACHUsbManager来自 Android 开发者文档UsbManager

此类允许您访问 USB 的状态并与 USB 设备进行通信。目前公共 API 仅支持主机模式。

Android 附件不允许 Android 托管 USB 连接,而是要求连接的设备这样做。通过让后台服务定期运行以下自定义方法,我能够在我的应用程序中检测到附件断开连接。

void checkForAccessory(){
        UsbAccessory[] deviceList = mUsbManager.getAccessoryList();
        if (deviceList != null){
            // My app checks if the device has already been initialized or if it needs to be initialized.
        } else {
            // Perform actions associated with a disconnect
        }
    }

只要checkForAccessory()经常运行,您将获得相当最新的附件断开检测。

于 2019-08-15T16:47:15.947 回答
0

你想要ACTION_USB_ACCESSORY_DETACHED的,从 API 级别 12 开始就存在。

只需BroadcastReceiver为其注册一个,如下所示:

val detachedFilter = IntentFilter(UsbManager.ACTION_USB_ACCESSORY_DETACHED)
context.registerReceiver(usbReceiver, detachedFilter)

usbReceiver看起来与此类似的地方:

object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val action = intent.action
        if (action == UsbManager.ACTION_USB_ACCESSORY_DETACHED) {
            // Do something about it
        }
    }
}
于 2021-09-30T23:15:12.490 回答
0

您可以使用 BroadcastReceiver 来监听 UsbManager.ACTION_USB_DEVICE_DETACHED 和 UsbManager.ACTION_USB_DEVICE_ATTACHED 事件。

<receiver android:name="UsbConnectionReceiver">
        <intent-filter>
            <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED">
            </action>
        </intent-filter>
        <intent-filter>
            <action android:name="android.hardware.usb.action.ACTION_USB_DEVICE_DETACHED">
            </action>
        </intent-filter>
    </receiver>

或者您可以定期循环通过连接的设备(使用计时器或 ScheduledExecutorService)检查您的设备是否在列表中。

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
UsbDevice device = deviceList.get("deviceName");

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
while(deviceIterator.hasNext()){
UsbDevice device = deviceIterator.next();
if (usbDeviceIsMyDevice(device)){
    // your code
}
}
于 2016-07-21T08:01:22.200 回答