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/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

发表回复

登录后才能评论