android實現USB通訊

在 Android 上枚舉 USB 設備除了使用?UsbManager.getDeviceList()?方法外,還有以下幾種常見的方式:

1.?使用 USB 設備過濾器(XML 配置)

通過在 AndroidManifest.xml 中配置 USB 設備過濾器,可以讓系統自動檢測并通知應用匹配的 USB 設備。

步驟:

  1. 創建 USB 設備過濾器 XML 文件(例如?res/xml/usb_device_filter.xml):
  1. <?xml version="1.0" encoding="utf-8"?>
    <resources><usb-device vendor-id="1234" product-id="5678" /> <!-- 指定具體 VID/PID --><!-- 或使用通配符匹配所有設備 --><!-- <usb-device /> -->
    </resources>
    
  2. 在 AndroidManifest.xml 中聲明過濾器
  1. <activity android:name=".UsbDeviceActivity"><intent-filter><action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /></intent-filter><meta-dataandroid:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"android:resource="@xml/usb_device_filter" />
    </activity>
    
  2. 在 Activity 中處理 USB 設備連接
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent = getIntent();String action = intent.getAction();if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);if (device != null) {// 處理連接的 USB 設備}}
}

2.?使用廣播接收器監聽 USB 設備插拔事件

通過注冊廣播接收器,可以實時監聽 USB 設備的插入和拔出事件。

示例代碼:

// 注冊廣播接收器
private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);if (device != null) {// 處理新連接的 USB 設備}} else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);if (device != null) {// 處理斷開連接的 USB 設備}}}
};// 注冊廣播接收器
IntentFilter filter = new IntentFilter();
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
registerReceiver(usbReceiver, filter);// 記得在 Activity 銷毀時取消注冊
@Override
protected void onDestroy() {super.onDestroy();unregisterReceiver(usbReceiver);
}

3.?使用 Android USB Host API(API 級別 12+)

通過 USB Host API,可以主動枚舉和管理連接的 USB 設備。

示例代碼:

UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();// 遍歷設備列表
for (UsbDevice device : deviceList.values()) {Log.d(TAG, "Device: " + device.getProductId() + ", VID: " + device.getVendorId());// 請求設備權限PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_IMMUTABLE);usbManager.requestPermission(device, permissionIntent);
}

4.?使用 USB 設備類過濾

可以根據設備類(如 HID、CDC、MIDI 等)來過濾和枚舉特定類型的 USB 設備。

示例代碼:

for (UsbDevice device : deviceList.values()) {// 獲取設備類int deviceClass = device.getDeviceClass();// 根據設備類過濾(例如,查找 HID 設備)if (deviceClass == UsbConstants.USB_CLASS_HID) {// 處理 HID 設備}
}

5.?使用 USB 設備接口過濾

通過檢查設備的接口(Interface)和端點(Endpoint),可以進一步篩選出符合條件的 USB 設備。

示例代碼:

for (UsbDevice device : deviceList.values()) {// 遍歷設備的所有接口for (int i = 0; i < device.getInterfaceCount(); i++) {UsbInterface usbInterface = device.getInterface(i);// 根據接口類過濾(例如,查找串口設備)if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_CDC_DATA) {// 處理 CDC 數據接口}}
}

6.?使用 USB 設備權限管理

在訪問 USB 設備前,需要獲取用戶權限:

private static final String ACTION_USB_PERMISSION = "com.example.USB_PERMISSION";// 請求權限
PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_IMMUTABLE);
usbManager.requestPermission(device, permissionIntent);// 處理權限回調
private final BroadcastReceiver permissionReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (ACTION_USB_PERMISSION.equals(action)) {synchronized (this) {UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {if (device != null) {// 權限已授予,可以訪問設備}} else {Log.e(TAG, "USB 權限被拒絕");}}}}
};

總結

以上方法各有適用場景:

  • XML 過濾器:適合靜態匹配特定 VID/PID 的設備。
  • 廣播接收器:適合實時監聽設備插拔事件。
  • USB Host API:適合主動枚舉和管理設備。
  • 設備類 / 接口過濾:適合篩選特定類型的 USB 設備。

實際開發中,通常需要結合多種方法來實現完整的 USB 設備管理功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79864.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79864.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79864.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FFmpeg視頻編碼的完整操作指南

步驟如下&#xff1a; 安裝和準備FFmpeg&#xff1a;確保包含所需編碼器&#xff08;如libx264&#xff09;。基本命令行編碼&#xff1a;使用ffmpeg命令進行轉碼&#xff0c;設置視頻編碼器、CRF、預設等。API編碼流程&#xff08;針對開發者&#xff09;&#xff1a; a. 注冊…

鴻蒙 UIAbility組件與UI的數據同步和窗口關閉

使用 EventHub 進行數據通信 Stage模型概念圖 根據 Stage 模型概念圖 UIAbility 先于 ArkUI Page 創建 所以&#xff0c;事件要先 .on 訂閱 再 emit 發布 假如現在有頁面 Page1 和他的 UIAbility // src/main/ets/page1ability/Page1Ability.ets onCreate(want: Want, laun…

全棧工程師實戰手冊:LuatOS日志系統開發指南!

本文聚焦LuatOS-log庫的實戰應用場景&#xff0c;通過完整案例演示日志模塊集成、格式定制及遠程同步方案&#xff0c;幫助全棧開發者構建靈活可靠的日志管理框架。下面&#xff0c;我們一起來認識LuatOS的log庫&#xff01; 一、 log.info() log info()主要打印一些正常的…

STM32-USART串口通信(9)

一、通信接口介紹 通信的目的&#xff1a;將一個設備的數據傳送到另一個設備&#xff0c;擴展硬件系統。 當STM32想要實現一些功能&#xff0c;但是需要外掛一些其他模塊才能實現&#xff0c;這就需要在兩個設備之間連接上一根或多跟通信線&#xff0c;通過通信線路發送或者接…

【MoveIt 2】使用 MoveIt 任務構造器(MoveIt Task Constructor)進行拾取和放置

本教程將引導您創建一個使用 MoveIt 任務構造器規劃抓取和放置操作的包。MoveIt 任務構造器&#xff08;https://github.com/moveit/moveit_task_constructor/tree/ros2/&#xff09;提供了一種為包含多個不同子任務&#xff08;稱為階段&#xff09;的任務進行規劃的方法。如果…

破解商業綜合體清潔管理困局:商業空間AI智能保潔管理系統全場景解決方案

方案整體概述 隨著商業綜合體日益向智能化、精細化管理轉型&#xff0c;傳統保潔工作面臨人員監管難、清潔效果評估難、應急響應滯后等諸多挑戰。為解決這些痛點&#xff0c;本系統依托計算機視覺、行為識別、圖像分割與深度學習等AI技術&#xff0c;構建一套集人員管理、工作…

spring響應式編程系列:異步消費數據

目錄 示例 大致流程 parallel cache PARALLEL_SUPPLIER newParallel init publishOn new MonoSubscribeOnValue ???????subscribe ???????new LambdaMonoSubscriber ???????MonoSubscribeOnValue.subscribe ???????onSubscribe ??…

視頻編解碼學習十二之Android疑點

一、android.view.SurfaceControl.setDisplaySurface的作用 android.view.SurfaceControl.setDisplaySurface 是 Android 系統中一個 native 層級別的 API&#xff0c;主要用于 設置某個物理顯示屏&#xff08;Display&#xff09;的輸出 Surface&#xff0c;屬于 SurfaceFlin…

家用或辦公 Windows 電腦玩人工智能開源項目配備核顯的必要性(含 NPU 及顯卡類型補充)

一、GPU 與顯卡的概念澄清 首先需要明確一個容易誤解的概念&#xff1a;GPU 不等同于顯卡。 顯卡和GPU是兩個不同的概念。 【概念區分】 在討論圖形計算領域時&#xff0c;需首先澄清一個常見誤區&#xff1a;GPU&#xff08;圖形處理單元&#xff09;與顯卡&#xff08;視…

Python----神經網絡(《Deep Residual Learning for Image Recognition》論文和ResNet網絡結構)

一、論文 1.1、論文基本信息 標題&#xff1a;Deep Residual Learning for Image Recognition 作者&#xff1a;Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun 單位&#xff1a;Microsoft Research 會議&#xff1a;CVPR 2016 主要貢獻&#xff1a;提出了一種深度殘…

Qt/C++開發監控GB28181系統/錄像文件查詢/錄像回放/倍速播放/錄像文件下載

一、前言 搞定了實時預覽后&#xff0c;另一個功能就是錄像回放&#xff0c;錄像回放和視頻點播功能完全一致&#xff0c;唯一的區別就是發送點播的sdp信息中攜帶了開始時間和結束時間&#xff0c;因為是錄像文件&#xff0c;所以有這個時間&#xff0c;而實時視頻預覽這個對應…

在Spark搭建YARN

&#xff08;一&#xff09;什么是SparkONYarn模式 Spark on YARN&#xff08;Yet Another Resource Negotiator&#xff09;是 Spark 框架在 Hadoop 集群中運行的一種部署模式&#xff0c;它借助 Hadoop YARN 來管理資源和調度任務。 架構組成 ResourceManager&#xff1a;作…

SpringAI

機器學習&#xff1a; 定義&#xff1a;人工智能的子領域&#xff0c;通過數據驅動的方法讓計算機學習規律&#xff0c;進行預測或決策。 核心方法&#xff1a; 監督學習&#xff08;如線性回歸、SVM&#xff09;。 無監督學習&#xff08;如聚類、降維&#xff09;。 強化學…

如何用Redis實現分布式鎖?RedLock算法的核心思想?Redisson的看門狗機制原理?

一、Redis分布式鎖基礎實現 public class RedisDistributedLock {private JedisPool jedisPool;private String lockKey;private String clientId;private int expireTime 30; // 默認30秒public boolean tryLock() {try (Jedis jedis jedisPool.getResource()) {// NX表示不…

前端面試寶典---js垃圾回收機制

什么是垃圾回收 垃圾回收是指一種自動內存管理機制&#xff0c;當聲明一個變量時&#xff0c;會在內存中開辟一塊內存空間用于存放這個變量。當這個變量被使用過后&#xff0c;可能再也不需要它了&#xff0c;此時垃圾回收器會自動檢測并回收這些不再使用的內存空間。垃圾回收…

阿里媽媽LMA2新進展:集成大語言模型與電商知識的通用召回大模型URM

近日&#xff0c;阿里媽媽在國際頂級學術會議 —— 國際萬維網大會&#xff08;International World Wide Web Conference, 簡稱WWW&#xff09;上共同主持了計算廣告算法技術相關的Tutorial&#xff08;講座&#xff09;&#xff0c;介紹了計算廣告領域的技術發展脈絡&#xf…

數字孿生實時監控汽車零部件工廠智能化巡檢新范式

在汽車制造業面臨數字化轉型時&#xff0c;汽車零部件工廠也面臨著提升生產效率、降低運營成本和增強市場競爭力的多重挑戰。傳統的巡檢方式已經難以滿足現代工廠對高效、精準管理和實時決策的需求。數字孿生系統的出現&#xff0c;為汽車零部件工廠提供了一種創新的智能化巡檢…

【計算機網絡】3數據鏈路層②

1. 數據鏈路層所處的地位 數據鏈路層使用的信道主要有兩種: ①點對點信道:PPP協議 ②廣播信道:有線局域網,CSMA/CD協議;無線局域網,CSMA/CA協議 對比項點對點信道 vs 單播廣播信道 vs 廣播核心是否一致? 一致(一對一傳輸)? 一致(一對所有傳輸)差異點前者是物理層…

c++中的函數(默認參數,占位參數,重載)

1&#xff0c;函數默認參數 在c中&#xff0c;函數的形參列表中的形參是可以有默認值得 語法&#xff1a;返回值類型 函數名 &#xff08;參數 默認值&#xff09;{} 示例&#xff1a; #include<iostream> using namespace std;//函數默認參數 // 就是如果傳了就…

【原創】使用阿里云存放一個臨時共享的文件

在某些場合&#xff0c;需要臨時將一個文件存儲到一個可被公網訪問的地方&#xff0c;某個服務需要訪問一下這個文件。這個文件基本上就是一次壽命&#xff0c;也就是你上傳一下&#xff0c;然后被訪問一下&#xff0c;這個文件的壽命就結束了。 對于這種需求&#xff0c;自建…