Android 用 libusb 操作 USB 设备,无须 root

Android libusb库的使用 阅读详情

http://www.freehum.com/2014/06/operate-usb-device-under-android-by-libusb-without-root.html

对原作者做了一定的改进

之前有段时间在 Android 下调用我们自己开发的 USB 摄像头,在 优快云 上讨论了一番,发现感兴趣的人蛮多了,不断网友发邮件来问,干脆放到博客上吧

基本思路:

利用 Android (3.1版本以上)的 USB HOST API 获得 USB 设备的 FileDescriptor,然后libusb 使用 FileDescriptor 打开 USB 设备,当然 libusb 需要做少量修改,后面有代码。

总体的效果就是,用户插入USB 设备,或者启动 Android 系统,你的 App 会根据事先设定的 device filter 自动启动。如果是第一次启动,会询问用户是否授权使用该USB设备。

关键代码(如何使用libusb,请参考官方文档):

获取 FileDescriptor
// get FileDescriptor by Android USB Host API
UsbManager manager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
 
PendingIntent mPermissionIntent = PendingIntent.getBroadcast(mContext, 0, 
                                                             new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
mContext.registerReceiver(mUsbReceiver, filter);
 
int fd = -1;
while(deviceIterator.hasNext()){
    UsbDevice device = deviceIterator.next();
    Log.i(TAG, device.getDeviceName() + " " + Integer.toHexString(device.getVendorId()) + 
               " " + Integer.toHexString(device.getProductId()));
 
    manager.requestPermission(device, mPermissionIntent);
    UsbDeviceConnection connection = manager.openDevice(device);
    if(connection != null){
       fd = connection.getFileDescriptor();
    } else
       Log.e(TAG, "UsbManager openDevice failed");
    break;
}
 
接着修改 libusb,我用的是libusbx-1.0.17,主要工作是增加一个 libusb_open_fd 函数,替代原来的 libusb_open,将上一步的 fd 传入即可。
libusbx\libusb\core.c 中在 libusb_open 后面增加 libusb_open_fd 函数
#ifdef ANDROID
int LIBUSB_CALL libusb_open_fd(libusb_device *dev, libusb_device_handle **handle, int fd)
{
struct libusb_context *ctx = DEVICE_CTX(dev);
struct libusb_device_handle *_handle;
size_t priv_size = usbi_backend->device_handle_priv_size;
int r;
usbi_dbg("open %d.%d", dev->bus_number, dev->device_address);
 
_handle = malloc(sizeof(*_handle) + priv_size);
if (!_handle)
return LIBUSB_ERROR_NO_MEM;
 
r = usbi_mutex_init(&_handle->lock, NULL);
if (r) {
free(_handle);
return LIBUSB_ERROR_OTHER;
}
 
_handle->dev = libusb_ref_device(dev);
_handle->claimed_interfaces = 0;
memset(&_handle->os_priv, 0, priv_size);
 
r = usbi_backend->open_fd(_handle, fd);
if (r < 0) {
usbi_dbg("open %d.%d returns %d", dev->bus_number, dev->device_address, r);
libusb_unref_device(dev);
usbi_mutex_destroy(&_handle->lock);
free(_handle);
return r;
}
 
usbi_mutex_lock(&ctx->open_devs_lock);
list_add(&_handle->list, &ctx->open_devs);
usbi_mutex_unlock(&ctx->open_devs_lock);
*handle = _handle;
 
/* At this point, we want to interrupt any existing event handlers so
 * that they realise the addition of the new device's poll fd. One
 * example when this is desirable is if the user is running a separate
 * dedicated libusb events handling thread, which is running with a long
 * or infinite timeout. We want to interrupt that iteration of the loop,
 * so that it picks up the new fd, and then continues. */
usbi_fd_notification(ctx);
 
return 0;
}
#endif

在libusbx\libusb\libusb.h中找到libusb_open函数的声明,在其下面添加libusb_open_fd声明:
 
int LIBUSB_CALL libusb_open_fd(libusb_device *dev, libusb_device_handle **handle, int fd);
在libusbx\libusb\libusbi.h中找到结构体usbi_os_backend,在其内部成员open下面添加
 
int (*open_fd)(struct libusb_device_handle *handle, int fd);
libusbx\libusb\os\linux_usbfs.c 中在 op_open 后面增加 op_open_fd 函数
 
#ifdef ANDROID//可以去掉,否则要到config.h中去定义才能是同
static int op_open_fd(struct libusb_device_handle *handle, int fd) {
struct linux_device_handle_priv *hpriv = _device_handle_priv(handle);
 
hpriv->fd = fd;
 
return usbi_add_pollfd(HANDLE_CTX(handle), hpriv->fd, POLLOUT);
}
#endif
libusbx\libusb\os\linux_usbfs.c 中在 结构体 linux_usbfs_backend 中 .open = op_open 一行后面增加一行
 
#ifdef ANDROID//可以去掉,否则要到config.h中去定义才能是同
    .open_fd = op_open_fd,
#endif


 
Libusb在Android平台上的环境以及原理     一、环境:配置NDK环境 1、下载libusb源码:https://github.com/libusb/libusb/releases,如下图所示 2、删除一些和Android平台无关的文件,删除后的文件如下图所示: 思考问题: Android是怎么获取usb设备? 如上图所示:连接adb shell,然后cd到/sys/bus/usb/devices/目录,命令ll... 阅读详情

相关推荐

CH340/CH341 安卓USB Host模式3大常见问题排查:OTG、权限、驱动

本文详细解析了CH340/CH341在安卓USB Host模式开发中的三大核心问题:OTG配置、权限获取与驱动兼容性。通过硬件检查、权限动态请求及驱动层解决方案,提供从基础配置到数据收发的完整指南,帮助开发者高效实现USB转串口通信。

430

Libusb库在Android下的使用例程

转载请注明:http://blog.csdn.net/hubbybob1/article/details/54863662 阅读本文前清先了解相关基础内容,操作步骤请阅读博客:libusb1.0在android内的移植和使用方法 在讲解了libusb库在Android下的移植和基本应用后,下面来讲解Libusb的Android工程;其工程步骤: 1.建立带有JNI工程的eclipse工

hubbybob1专栏 2万+

Android手机用OTG接USB摄像头实时预览开发套件(免Root,兼容MTK平台)

直接在Android 4.0.4及以上系统上实现USB摄像头视频流采集与显示,支持Micro USB和USB-C接口设备,只需一根OTG线或带供电的OTG集线器。不依赖Root权限,基于标准UVC协议通信,自动识别并适配常见分辨率、帧率和YUV/RGB格式。底层集成LibUsb库,增强USB设备枚举稳定性,特别优化了联发科(MediaTek)等原生驱动支持较弱机型的兼容性。工程采用Android Studio标准Gradle结构,包含JNA封装层、USB权限动态申请逻辑、SurfaceView与Textur

y2z3a4b5c的博客 270

Android/linux从usb声卡获取音频(使用libusb库)----环境,lsusb命令的介绍(一)

Android/linux从usb声卡获取音频(使用libusb库)---环境,lsusb命令的介绍(一) Android/linux从usb声卡获取音频(使用libusb库)---设备环境的确认(二) Android/linux从usb声卡获取音频(使用libusb库)---libusb库获取“纯麦”音频数据(三) Android/linux从usb声卡获取...

Canok 2727

android上可用的libusb.so

基于libusb-1.0.3版本,经过ndk编译的,经测试在androis上可用

安卓下libusb编译

mk都整理好了,直接进入到相应的目录下使用ndk-build编译就可以了

高通android设备libusb,Android 用 libusb 操作 USB 设备,无须 root

获取FileDescriptor// get FileDescriptor by Android USB Host APIUsbManager manager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);final String ACTION_USB_PERMISSION = "com.android.example...

weixin_39901332的博客 1337

ISO 15118-3协议栈开发避坑指南:从EvseSlac状态机设计看电动汽车充电握手难题

本文深入剖析了ISO 15118-3协议栈开发中的核心挑战,特别是SLAC握手流程的实现难点。以Everest项目的EvseSlac状态机为例,详细解读了从状态机设计、多厂商PLC芯片兼容性处理,到严苛的时序与超时控制等关键工程实践,为开发者提供了一套超越协议文档的、可直接落地的避坑指南和软件实现方案。

jump7的博客 270

libusb与移动设备USB OTG通信:Android平台实现方案

你是否曾面临这样的开发困境:需要在Android设备上与USB外设通信,却受限于系统权限和平台差异?传统方案要么需要root权限,要么依赖厂商定制API,兼容性和安全性难以兼顾。本文将系统讲解如何基于libusb库,在非root的Android设备上通过USB OTG(On-The-Go)实现稳定可靠的USB通信,涵盖从环境搭建到数据传输的完整流程。 读完本文你将获得: - 理解Android ...

gitblog_01051的博客 1058

高通平台Android稳定性调试笔记:手把手教你用T32、Crash Utility分析Kernel Panic与RAM Dump

本文详细介绍了高通平台Android内核崩溃的分析方法,包括使用T32 Simulator和Crash Utility工具链解析Kernel Panic与RAM Dump。从环境配置、dump文件预处理到高级调试技巧,手把手教你如何定位和解决Android系统崩溃问题,特别适用于MSM/SA8155平台的开发者。

weixin_42543046的博客 529

安检机图像处理避坑指南:从条纹校正到物质分类,那些论文里没写的工程细节

本文深入探讨了双能X射线安检机图像处理中的关键工程实践,从条纹校正到物质分类,揭示了论文中未提及的实用技巧。针对探测器校正、物质分类模糊、伪彩色系统设计等核心问题,提供了动态参数更新、空间上下文分析和自适应色彩映射等解决方案,助力提升安检系统的准确性和鲁棒性。

weixin_30325487的博客 889

Android应用利用libusb与usb设备通信遇到的权限问题

有2种方法: 1.chmod 666 dev/bus/usb/* 2.如果没有android root权限那就麻烦一点,描述个大概 AndroidManifest.xml中添加: ...     ...                      device_filter.xml内容:               /

qq_29040937的博客 5031

14、固态变压器(SST)供电的直流微电网控制策略解析

本文详细解析了基于固态变压器(SST)供电的直流微电网的分层功率管理与控制策略。重点介绍了二次控制和三次控制算法的原理及实现方式,探讨了将SST作为固态同步电机(SSSM)的控制概念及其频率调节方法。通过小型直流微电网的实验案例验证了控制策略的有效性,并对不同三次控制方法的优缺点进行了比较。最后,文章提出了未来控制策略的优化方向,包括通信技术提升、多目标优化和智能算法的应用,为直流微电网的可靠、高效运行提供了理论支持和实践指导。

star的博客 554

Termux-ADB:在Android设备上实现无Root权限的USB调试革命

在移动开发领域,传统Android调试一直受限于root权限要求。Termux-ADB项目彻底打破这一限制,让你能够在任何Android设备上直接运行adb和fastboot命令,实现真正的移动端到移动端的USB调试体验。 ## 快速上手 想要体验这项突破性技术,只需几个简单步骤: - 从F-Droid应用商店安装Termux应用 - 同步安装Termux:API扩展以获取USB设备访问权限

gitblog_01086的博客 1093

3. Matérn协方差模型与随机偏微分方程

对应的高斯马尔可夫随机场 (GMRF)可以通过使用某种随机偏微分方程(SPDE)明确构造,当由高斯白噪声驱动时,随机偏微分方程的解是具有 Matérn 协方差函数的高斯场(GF)

weixin_40614311的博客 1748

YOLOv9改进策略 | Conv篇 | 2024最新ECCV最新大感受野的小波卷积WTConv助力YOLOv9有效涨点

本文给大家带来的改进机制是一种新的卷积层,称为WTConv(小波卷积层),它利用小波变换(WT)来解决卷积神经网络(CNN)在实现大感受野时遇到的过度参数化问题。WTConv的主要目的是通过对输入数据的不同频率带进行处理,使CNN能够更有效地捕捉局部和全局特征,WTConv成功解决了CNN在感受野扩展中的参数膨胀问题,提供了一种更为高效、鲁棒且易于集成的卷积层解决方案,我将其用于二次创新YOLOv9中的RepNCSPELAN4机制可以减少一定的参数量和计算量,达到一个可观的轻量化作用。

Snu77的博客 1544

无需ROOT!libaums:让Android轻松访问USB存储设备的终极开源方案

在Android开发中,访问USB存储设备通常需要复杂的权限配置或系统ROOT,这给开发者和普通用户带来了诸多不便。libaums作为一款强大的开源库,彻底改变了这一现状,它允许Android设备在无需ROOT的情况下直接与USB大容量存储设备进行交互,为移动应用开发提供了全新的可能性。 ## 🚀 什么是libaums? libaums(USB Mass Storage Library fo

gitblog_00054的博客 1109

基于深度学习的文字识别与检测算法研究

基于深度学习的文字识别与检测算法研究 1. 背景介绍 1.1 文字识别与检测的重要性 在当今信息时代,文字作为人类交流和传递信息的主要载体,无处不在。从日常生活中的路牌、广告牌,到办公场所的文件、合同,再到互联网上的网页、图片等

AI天才研究院 1044

深度揭秘termux-adb:普通adb为何只能root设备运行?USB权限原理大揭秘

termux-adb 是一个**免 root 即可在 Termux 中运行 adb 和 fastboot** 的改造方案:用一台安卓手机当"电脑",通过 USB 线连接另一台设备,直接完成 adb 调试。本文带你搞懂"普通 adb 为何在非 root 手机上失灵"背后的 USB 权限原理,以及 termux-adb 是如何用一个巧妙的文件描述符传递技巧绕开这道墙的 🧩 ## termux-ad

gitblog_01115的博客 136

秋招突击——笔试整理——8/25——拼多多笔试整理

继续加油! 转变思维,有简单到复杂,由直观到抽象,这种贪心模拟的题目一直是这样的!

Blackoutdragon的博客 2403

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android usb 1.0驱动,libusb1.0在android内的移植和使用方法

libusb1.0在android内的移植和使用方法本文主要讲述的libusb在android下的移植和使用方法,并且在应用的方面可以举一反三转载著名:http://blog..net/hubbybob1/article/details/522449991.编译编译安卓版libusb库如下步骤:A.下载最新的NDK:http://developer.android.com/tools/sdk/nd...

weixin_36011546的博客 898

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Android设备使用libusb和usb声卡

由于工作需要,需要在android机上使用usb外接设备,usb设备是一个声卡,首先需要加密认证,然后才使用声卡功能,加密认证时使用libusb做usb通信,使用声卡时,用tinyalsa。全部在jni中完成。 但是被权限问题折腾了好几天。由于SELinux安全机制原因,即使在命令行给了usb设备777的权限,在jni中仍然没有操作权限。下面给出解决办法: 首先设备需要有root权限, ad

u013547134的专栏 5797

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

libusb Android jni,libusb1.0在android内的移植和使用方法

libusb1.0在android内的移植和使用方法本文主要讲述的libusb在android下的移植和使用方法,并且在应用的方面可以举一反三转载著名:http://blog.csdn.net/hubbybob1/article/details/522449991.编译编译安卓版libusb库如下步骤:B.提取NDKC.打开终端并确保配置好的NDK为全局环境变量D.进入/libusb/androi...

weixin_39553776的博客 743

termux-adb进阶指南:fastboot命令为什么慢?USB设备扫描机制深度解析

[termux-adb](https://link.gitcode.com/i/c45493441ef17d2255d29a3d663afd8c) 是一个让 Android 手机**免 root 权限**在 Termux 中直接运行 `adb` 和 `fastboot` 的工具——用一根 USB-C 公对公数据线,一台手机就能调试另一台设备。但不少用户发现:`adb devices` 一切正常,`

gitblog_00052的博客 705
上一篇: 环形缓冲区的设计与实现
下一篇: libusb1.0在android内的移植和使用方法
葫芦娃二娃
博客等级 码龄15年 1850粉丝 69原创
评论 54
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值