Android USB連接:快速實現設備與計算機之間的數據傳輸

一、USB連接概述

USB(Universal Serial Bus)是一種通用的計算機介面標準,可用於連接各種外部設備,並提供高速數據傳輸功能。USB介面具有熱插拔功能,插入USB設備後,計算機會自動識別設備並載入驅動程序。在Android上,USB介面可以用於連接各種外部設備,例如滑鼠、鍵盤、攝像頭、存儲設備、手機等,實現與設備的數據傳輸和交互。

二、USB連接方式

在Android上,USB連接可以採用以下兩種方式:

1、MTP方式(Media Transfer Protocol):MTP是一種基於USB的傳輸協議,可以實現設備和計算機之間的文件傳輸。使用MTP連接,設備只能作為文件傳輸的客戶端,無法進行其他操作。

2、ADB方式(Android Debug Bridge):ADB是一種通信方式,允許計算機通過USB連接到Android設備,進行開發和調試操作,例如獲取設備的日誌信息、推送文件到設備、安裝應用程序等。

三、USB連接實現

1、USB許可權配置

在使用USB連接時,需要在AndroidManifest.xml文件中添加以下許可權:

<uses-permission android:name="android.permission.USB_PERMISSION"/>

然後在代碼中獲取USB許可權:

private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";

private void getUsbPermission(UsbDevice device) {
    // 請求USB許可權
    PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
    usbManager.requestPermission(device, permissionIntent);
}

獲取USB許可權需要向系統發出請求,請求結果通過廣播方式返回。

2、USB設備查詢和連接

在使用USB功能之前,需要查詢設備並建立連接。

查詢USB設備列表:

private List findUSBDeviceList() {
    List deviceList = new ArrayList();
    // 獲取USB設備列表
    for (UsbDevice device : usbManager.getDeviceList().values()) {
        deviceList.add(device);
    }
    return deviceList;
}

建立USB連接:

private void openUSBDevice(UsbDevice device) {
    // 打開USB設備
    usbInterface = device.getInterface(0);
    usbEndpointIn = usbInterface.getEndpoint(0);
    usbEndpointOut = usbInterface.getEndpoint(1);
    usbConnection = usbManager.openDevice(device);
    if (usbConnection != null && usbConnection.claimInterface(usbInterface, true)) {
        Log.d(TAG, "成功打開設備!");
    } else {
        Log.e(TAG, "打開設備失敗!");
    }
}

建立連接需要先獲取USB設備列表,選擇需要連接的設備,打開設備通道,並聲明要使用的介面。

3、USB數據傳輸

USB數據傳輸可以通過輸入輸出流實現。

發送數據:

private void sendData(byte[] data) {
    int ret = usbConnection.bulkTransfer(usbEndpointOut, data, data.length, 1000);
    if (ret < 0) {
        Log.e(TAG, "發送數據失敗!");
    }
}

接收數據:

private String receiveData() {
    byte[] buffer = new byte[64];
    int ret = usbConnection.bulkTransfer(usbEndpointIn, buffer, buffer.length, 1000);
    if (ret < 0) {
        return null;
    }
    return new String(buffer, 0, ret);
}

通過bulkTransfer函數可以實現批量數據傳輸,第一個參數是傳輸的端點,第二個參數是要傳輸的數據,第三個參數是數據長度,第四個參數是超時時間。函數返回值小於0表示傳輸失敗。

四、示例代碼

以下是一個簡單的USB連接示例代碼:

public class MainActivity extends AppCompatActivity {

    private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
    private static final String TAG = "MainActivity";

    private UsbManager usbManager;
    private UsbInterface usbInterface;
    private UsbEndpoint usbEndpointIn;
    private UsbEndpoint usbEndpointOut;
    private UsbConnection usbConnection;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        usbManager = (UsbManager)getSystemService(Context.USB_SERVICE);

        // 註冊USB廣播接收器
        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
        registerReceiver(usbReceiver, filter);

        // 獲取USB設備列表
        List deviceList = findUSBDeviceList();
        if (deviceList.isEmpty()) {
            Log.e(TAG, "No USB devices found!");
        } else {
            // 選擇第一個設備進行連接
            UsbDevice device = deviceList.get(0);
            // 請求USB許可權
            getUsbPermission(device);
        }
    }

    private BroadcastReceiver usbReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (ACTION_USB_PERMISSION.equals(action)) {
                synchronized (this) {
                    UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                        if (device != null) {
                            // 成功獲取USB許可權,建立連接
                            openUSBDevice(device);
                        }
                    } else {
                        Log.e(TAG, "USB permission denied!");
                    }
                }
            }
        }
    };

    private List findUSBDeviceList() {
        List deviceList = new ArrayList();
        // 獲取USB設備列表
        for (UsbDevice device : usbManager.getDeviceList().values()) {
            deviceList.add(device);
            Log.d(TAG, "USB device found: DeviceName=" + device.getDeviceName() + ", VendorId=" + device.getVendorId() +
                    ", ProductId=" + device.getProductId() + ", InterfaceCount=" + device.getInterfaceCount());
        }
        return deviceList;
    }

    private void getUsbPermission(UsbDevice device) {
        // 請求USB許可權
        PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
        usbManager.requestPermission(device, permissionIntent);
    }

    private void openUSBDevice(UsbDevice device) {
        // 打開USB設備
        usbInterface = device.getInterface(0);
        usbEndpointIn = usbInterface.getEndpoint(0);
        usbEndpointOut = usbInterface.getEndpoint(1);
        usbConnection = usbManager.openDevice(device);
        if (usbConnection != null && usbConnection.claimInterface(usbInterface, true)) {
            Log.d(TAG, "成功打開設備!");
            // 發送數據
            sendData("Hello, USB!".getBytes());
            // 接收數據
            String data = receiveData();
            if (data != null) {
                Log.d(TAG, "接收到數據:" + data);
            } else {
                Log.e(TAG, "接收數據失敗!");
            }
        } else {
            Log.e(TAG, "打開設備失敗!");
        }
    }

    private void sendData(byte[] data) {
        int ret = usbConnection.bulkTransfer(usbEndpointOut, data, data.length, 1000);
        if (ret < 0) {
            Log.e(TAG, "發送數據失敗!");
        }
    }

    private String receiveData() {
        byte[] buffer = new byte[64];
        int ret = usbConnection.bulkTransfer(usbEndpointIn, buffer, buffer.length, 1000);
        if (ret < 0) {
            return null;
        }
        return new String(buffer, 0, ret);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(usbReceiver);
    }
}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/232341.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-11 12:51
下一篇 2024-12-11 12:51

相關推薦

  • 馮·諾伊曼計算機體系結構

    本文將從多個方面對馮·諾伊曼計算機體系結構進行詳細的探究和闡述。 一、簡介 馮·諾伊曼計算機是現代計算機體系結構的開山鼻祖,是一種以程序控制為基礎的計算機體系結構。其核心思想在於將…

    編程 2025-04-29
  • Ojlat:一款快速開發Web應用程序的框架

    Ojlat是一款用於快速開發Web應用程序的框架。它的主要特點是高效、易用、可擴展且功能齊全。通過Ojlat,開發人員可以輕鬆地構建出高質量的Web應用程序。本文將從多個方面對Oj…

    編程 2025-04-29
  • Python計算機程序代碼全面介紹

    本文將從多個方面對Python計算機程序代碼進行詳細介紹,包括基礎語法、數據類型、控制語句、函數、模塊及面向對象編程等。 一、基礎語法 Python是一種解釋型、面向對象、動態數據…

    編程 2025-04-29
  • Python計算機二級刷題軟體推薦

    Python作為編程語言的代表,已經在計算機學習和開發領域佔據了重要角色。Python計算機二級是國家信息技術應用能力證書的一種,是計算機應用能力的重要評估標準。對於想要獲取Pyt…

    編程 2025-04-29
  • 如何解決egalaxtouch設備未找到的問題

    egalaxtouch設備未找到問題通常出現在Windows或Linux操作系統上。如果你遇到了這個問題,不要慌張,下面我們從多個方面進行詳細闡述解決方案。 一、檢查硬體連接 首先…

    編程 2025-04-29
  • 二階快速求逆矩陣

    快速求逆矩陣是數學中的一個重要問題,特別是對於線性代數中的矩陣求逆運算,如果使用普通的求逆矩陣方法,時間複雜度為O(n^3),計算量非常大。因此,在實際應用中需要使用更高效的演算法。…

    編程 2025-04-28
  • 計算機二級Python語言程序設計難嗎?

    計算機二級Python語言程序設計並不難,只需要掌握好基礎知識,多練習,多思考,就能輕鬆掌握。 一、Python基礎知識 Python語言相對於其他編程語言來說,語法簡介明了,易於…

    編程 2025-04-28
  • 快速排序圖解

    快速排序是一種基於分治思想的排序演算法,效率非常高。它通過在序列中尋找一個主元,將小於主元的元素放在左邊,大於主元的元素放在右邊,然後在左右子序列中分別遞歸地應用快速排序。下面將從算…

    編程 2025-04-28
  • Python性能分析: 如何快速提升Python應用程序性能

    Python是一個簡潔高效的編程語言。在大多數情況下,Python的簡潔和生產力為開發人員帶來了很大便利。然而,針對應用程序的性能問題一直是Python開發人員需要面對的一個難題。…

    編程 2025-04-27
  • NB設備上傳數據方案

    NB(Narrow Band)是一種物聯網通信技術,可以實現低功耗、寬覆蓋、多連接等特點。本文旨在探討如何使用NB設備上傳數據。在這篇文章中,我們將介紹NB設備上傳數據的基本原理、…

    編程 2025-04-27

發表回復

登錄後才能評論