`
Leif_冬
  • 浏览: 47288 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

android 新增一個廣播偵聽USB設備的插拔

 
阅读更多

太懶,直接上patch:

diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java
index 376a4de..be64369 100644
--- a/core/java/android/hardware/usb/UsbManager.java
+++ b/core/java/android/hardware/usb/UsbManager.java
@@ -84,6 +84,21 @@ public class UsbManager {
             "android.hardware.usb.action.USB_STATE";
 
     /**
+     * Broadcast Action: A broadcast for Vehice Cradle state changes.
+     *
+     * This is a sticky broadcast intent for clients that include Vehicle cradle state connected/dis
+     connected state,
+     * <ul>
+     * <li> {@link #VEHICLE_CRADLE_CONNECTED} boolean indicating whether vehicle cradle is connected
+     or disconnected.
+     * </ul>
+     *
+     * @hide
+     */
+    public static final String ACTION_VEHICLE_CRADLE_STATE =
+            "android.hardware.usb.action.VEHICLE_CRADLE_STATE";
+
+    /**
      * Broadcast Action: A broadcast for USB port changes.
      *
      * This intent is sent when a USB port is added, removed, or changes state.
@@ -176,6 +191,14 @@ public class UsbManager {
     public static final String USB_CONFIGURED = "configured";
 
     /**
+     * Boolean extra indicating whether vehicle cradle is connected or disconnected.
+     * Used in extras for the {@link #ACTION_VEHICLE_CRADLE_STATE} broadcast.
+     *
+     * {@hide}
+     */
+    public static final String VEHICLE_CRADLE_CONNECTED = "connected";
+
+    /**
      * Boolean extra indicating whether confidential user data, such as photos, should be
      * made available on the USB connection. This variable will only be set when the user
      * has explicitly asked for this data to be unlocked.
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 47f1994..1f6a787 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -243,6 +243,7 @@
     <protected-broadcast android:name="android.hardware.usb.action.USB_ACCESSORY_DETACHED" />
     <protected-broadcast android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
     <protected-broadcast android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
+    <protected-broadcast android:name="android.hardware.usb.action.VEHICLE_CRADLE_STATE" />
 
     <protected-broadcast android:name="android.intent.action.HEADSET_PLUG" />
     <protected-broadcast android:name="android.media.action.HDMI_AUDIO_PLUG" />
diff --git a/services/usb/java/com/android/server/usb/UsbHostManager.java b/services/usb/java/com/android/server/usb/UsbHostManager.java
index c272c76..25033df 100644
--- a/services/usb/java/com/android/server/usb/UsbHostManager.java
+++ b/services/usb/java/com/android/server/usb/UsbHostManager.java
@@ -81,6 +81,11 @@ public class UsbHostManager {
     // contains all connected USB devices
     private final HashMap<String, UsbDevice> mDevices = new HashMap<>();
 
+    private static final String HSUSB_STATE_MATCH =
+                        "DEVPATH=/devices/soc/a800000.ssusb/a800000.dwc3/xhci-hcd.0.auto/usb1/1-1";
+    /*current vehicle cradle state*/
+    private boolean mConnected;
+
     private static final String HSUSB_MSR_MATCH =
             "DEVPATH=/devices/soc/a800000.ssusb/a800000.dwc3/xhci-hcd.0.auto/usb1/1-1";
     // current MSR connection state
@@ -184,6 +189,10 @@ public class UsbHostManager {
         mHostBlacklist = context.getResources().getStringArray(
                 com.android.internal.R.array.config_usbHostBlacklist);
         mUsbAlsaManager = alsaManager;
+        if(ZebraUtils.isZebra()){
+            // Watch for Host USB configuration changes
+            mUsbUEventVehicleCradleObserver.startObserving(HSUSB_STATE_MATCH);
+        }
         mSettingsManager = settingsManager;
         String deviceConnectionHandler = context.getResources().getString(
                 com.android.internal.R.string.config_UsbDeviceConnectionHandling_component);
@@ -485,6 +494,51 @@ public class UsbHostManager {
             mMSRConnected = 0;  // reset flag
         }
     }
+
+     /*
+      * Listens for uevent messages from the kernel to monitor Vehicle Cradle state
+      */
+    private final UEventObserver mUsbUEventVehicleCradleObserver = new UEventObserver() {
+        @Override
+        public void onUEvent(UEventObserver.UEvent event) {
+            if (DEBUG) Slog.v(TAG, "USB UEVENT: " + event.toString());
+
+            String action = event.get("ACTION");
+            String devtype = event.get("DEVTYPE");
+            String product = event.get("PRODUCT");
+            if (action != null && product!= null && devtype != null) {
+                updateVehicleCradleState(action, devtype, product);
+            }
+        }
+    };
+    /*
+     * update Vehicle Cradle state for
+     * vendor id = 1d6b , product id = 0002 , bcddevice = 310
+     */
+    private void updateVehicleCradleState(String action, String devtype, String product) {
+
+        if (("add".equals(action)) && ("usb_device".equals(devtype)) && ("1d6b/2/310".equals(product
+        ))) {
+            mConnected = true;
+            updateVehicleCradleStateBroadcast();
+        } else if (("remove".equals(action)) && ("usb_device".equals(devtype)) && ("1d6b/2/310".equals(product))) {
+            mConnected = false;
+            updateVehicleCradleStateBroadcast();
+        }
+    }
+    /*
+     * broadcast intent on vehicle cradle state change
+     */
+    private void updateVehicleCradleStateBroadcast() {
+        // send a sticky broadcast containing current Vehicle Cradle state
+        Intent intent = new Intent(UsbManager.ACTION_VEHICLE_CRADLE_STATE);
+        intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING
+                | Intent.FLAG_RECEIVER_FOREGROUND);
+        intent.putExtra(UsbManager.VEHICLE_CRADLE_CONNECTED, mConnected);
+        Slog.i(TAG, "vehicle cradle broadcasting " + intent + " connected: " + mConnected);
+        mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
+    }
+
     /* Called from JNI in monitorUsbHostBus() to report new USB configuration for the device
        currently being added.  Returns true if successful, false in case of error.
      */

 

分享到:
评论

相关推荐

    android检测U盘插拔事件

    在Android中,系统会发送一个名为`ACTION_USB_DEVICE_ATTACHED`的广播当U盘插入,以及`ACTION_USB_DEVICE_DETACHED`的广播当U盘被移除。我们可以创建一个自定义的BroadcastReceiver,注册这两个广播事件,并在对应的...

    C#检测USB的插入和拔出,绝对有用

    以下是一个简单的C#示例,演示如何创建一个USB设备插入和拔出的检测器: ```csharp using System; using System.Management; public class UsbDetector { private ManagementEventWatcher watcher; public ...

    android wifi是否连接的侦听

    本文将深入探讨如何实现“Android WiFi是否连接的侦听”这一功能,以及涉及的Android广播接收器的开发。 首先,我们要了解在Android系统中,WiFi的状态是由`ConnectivityManager`和`WifiManager`这两个关键类来管理...

    Form1.rar_USB 监听_USB通信_c#USB通信_usb监听_usb监听代码

    另一种方法是使用WinUSB(Windows Driver Kit,WDK)提供的WinUSB.sys驱动程序,这是一个通用的USB驱动,可以直接与USB设备通信。C#中可以通过P/Invoke技术调用WinAPI函数,或者使用像SharpUSBLib这样的开源库,它为...

    基于STM32 的联合调试侦听设备解决方案(原理图、PCB源文件、调试工具、视频)

    基于STM32 的联合调试侦听设备解决方案(原理图、PCB源文件、调试工具、视频) 基于STM32 的联合调试侦听设备解决方案(原理图、PCB源文件、调试工具、视频) 基于STM32 的联合调试侦听设备解决方案(原理图、PCB...

    基于STM32 的联合调试侦听设备解决方案(原理图、PCB源文件、调试工具、视频).zip

    本解决方案提供的资料包旨在帮助开发者构建一个联合调试侦听设备,它可能是一个用于监控、分析或控制STM32微控制器的外围设备。 在该压缩包中,您将找到以下关键资源: 1. **原理图**:原理图是设备硬件设计的核心...

    Android Listener侦听的N种写法

    ### Android Listener侦听的N种写法:深入解析与应用 在Android开发中,`Listener`接口是处理用户交互事件的核心机制之一。无论是点击、触摸还是其他类型的事件,`Listener`都提供了统一的处理方式。本文将围绕...

    基于STM32 的联合调试侦听设备解决方案(原理图、PCB源文件、调试工具、视频).rar

    现在的嵌入式软件的开发,往往需要多人联合开发,或者公司之间联合开发,开发的过程中需要涉及到开发人员...实现了对BTM设备的侦听和测试,实现了对通讯量插件、数字量插件、模拟量插件的侦听和测试,实现了CAN盒功能.

    2023基于STM32 的联合调试侦听设备解决方案(原理图、PCB源文件、调试工具、视频)

    基于STM32 的联合调试侦听设备解决方案(原理图、PCB源文件、调试工具、视频)基于STM32 的联合调试侦听设备解决方案(原理图、PCB源文件、调试工具、视频)基于STM32 的联合调试侦听设备解决方案(原理图、PCB...

    (优作)基于STM32 的联合调试侦听设备解决方案(原理图、PCB源文件、调试工具、视频)

    基于STM32的联合调试侦听设备的解决方案,包括原理...文章的目标是提供一个实用且详细的联合调试侦听设备构建过程,助力读者提高硬件调试效率,加深对STM32应用的理解。 关键词标签:STM32 联合调试 侦听设备 解决方案

    基于STM32 的联合调试侦听设备解决方案(原理图、PCB源文件、调试工具、视频).7z

    基于STM32 的联合调试侦听设备解决方案(原理图、PCB源文件、调试工具、视频).7z基于STM32 的联合调试侦听设备解决方案(原理图、PCB源文件、调试工具、视频).7z基于STM32 的联合调试侦听设备解决方案(原理图、...

    android-lib-broadcast-receiver:一个用于广播接收器的android库

    一个简单的Android广播接收器库。 介绍 该库旨在使用“观察者”设计模式处理所有广播接收器操作,以保持更新所有广播侦听器。 例如,通过使用此库,无论您在应用程序中的哪个位置,都可以跟踪应用程序网络状态。 只...

    ANDROID传感器开发.pdf

    Android 是一个面向应用程序开发的丰富平台,它拥有许多具有吸引力的用户界面元素、数据管理和网络应用等优秀的功能。Android 还提供了很多颇具特色的接口。本文我们将分别介绍这些吸引开发者眼球的特色开发,主要...

    时间类型侦听函数

    时间类型的侦听函数就是这种模式的一个典型例子。 - **回调函数**: 在时间类型的侦听函数中,回调函数是实际执行的时间到时后要调用的代码块。当定时器触发时,系统会调用这个函数来执行预定的任务。 2. **工作...

    多线程 TCIIP 侦听器

    这个示例中,`StartListening`方法启动侦听器,`AcceptClients`方法在一个无限循环中等待新的连接,接收到连接后,它会启动一个新的线程`HandleClientConnection`来处理客户端的通信。这样,服务器可以同时处理多个...

    8种加密狗侦听工具8种加密狗侦听工具

    8种加密狗侦听工具8种加密狗侦听工具8种加密狗侦听工具

    arp 侦听工具,局域网工具

    描述中提到的“局域网侦听工具.C:\TDDOWNLOAD\Spynet.rar”,这可能是一个名为“Spynet”的特定 ARP 侦听工具,它是一个RAR压缩文件,位于C盘的TDDOWNLOAD文件夹下。RAR是一种常见的文件压缩格式,用于打包和存储多...

    图解冲突域、广播域

    如果交换机收到一个广播数据包后,它会向其所有的端口转发此广播数据包。因此,交换机上的所有主机都可以收到该广播数据包。 冲突域和广播域是计算机网络中两个重要的概念,用于描述网络中的数据传输和通信范围。...

Global site tag (gtag.js) - Google Analytics