安卓USB主机和隐藏设备

24

我正在开发一个Android应用程序,需要与USB设备通信。 我尝试在我的应用程序中使用标准的Google API,但设备列表始终为空。

如果我使用Google API和USB设备信息,情况也是一样的。 Google API搜索到的设备列表为空。

lsusb的结果如下:

Bus 001 Device 001: ID 1d6b:0001
Bus 002 Device 001: ID 1d6b:0002
Bus 003 Device 001: ID 1d6b:0001
Bus 002 Device 002: ID 2226:0014

我的设备是2226:0014。

Eclipse的日志:

I/USB3G(92): event { 'add', '/devices/platform/sw-ehci.1/usb2/2-1', 'usb', '', 189, 133 }
I/USB3G(92): path : '/sys/devices/platform/sw-ehci.1/usb2/2-1'
I/USB3G(92): VID :size 5,vid_path '/sys/devices/platform/sw-ehci.1/usb2/2-1/idVendor',VID  '2226
I/USB3G(92): '.
I/USB3G(92): PID :size 5,Pid_path '/sys/devices/platform/sw-ehci.1/usb2/2-1/idProduct',PID  '0014
I/USB3G(92): '.
I/USB3G(92): cmd=/system/etc/usb_modeswitch.sh /system/etc/usb_modeswitch.d/2226_0014 &,
I/USB3G(92): excute ret : 0,err:No such file or directory
如果我插入像RS232适配器、蓝牙适配器这样的设备,没有任何反应,并且API和lsusb中也没有显示任何结果。
该设备的协议基于ezusb库。 Android版本:4.0.3 内核版本:3.0.8 固件版本:crane_evb-eng 4.0.3 IMLK74k 20120330
是否有一种通过API访问隐藏USB设备的方法,或者我需要编写驱动程序并将其打补丁到固件中来支持此设备?
更新:即使我在system/etc/usb_modeswitch.d/中创建了名为2226_0014的信息文件,其中包含

DefaultVendor= 0x2226
DefaultProduct=0x0014
TargetVendor=  0x2226
TargetProductList="0014"
MessageEndpoint="0x00"
NeedResponse=1
CheckSuccess=20
我遇到了相同的错误:"没有这个文件或目录"。
4个回答

43

要启用USB主机API支持,您应该添加一个名为android.hardware.usb.host.xml的文件,其中包含以下行:

<permissions>
 <feature name="android.hardware.usb.host"/>
</permissions>

进入文件夹

/system/etc/permissions

在那个文件夹中找到名为的文件

handheld_core_hardware.xml or tablet_core_hardware.xml 

并添加

<feature name="android.hardware.usb.host" />

将内容添加到<permissions>部分。

重新启动您的设备。USB主机API应该可以工作。

在安卓4.0上测试通过CUBE U30GT。


@Greg-q:手持设备核心硬件文件 handheld_core_hardware.xml 或平板电脑核心硬件文件 tablet_core_hardware.xml 位于哪里?我没有找到这些文件。 - Prasad
1
在进行了这些更改之后,对我来说DeviceList仍然是空的,尽管当运行dmesg时我可以看到我的HID设备已连接。 - TimothyP
需要说明的是,只有当您是ROM开发人员或者拥有root和可写(通过重新挂载)系统分区时,才能进行这些更改,并且只有在硬件支持的情况下才值得这样做。 - Chris Stratton
@Droider 你是怎么编辑的?我也遇到了同样的问题:只读文件系统。 - Gaurav
1
@Gaurav 我的设备已经取得了root权限,所以这对我没有任何影响。 - Calvin
所有这些都需要root访问权限吗? - Matical

6

太好了!这个方法适用于我的Envizen V700NA,运行的是Android 4.0.4。

小错误: <feature name="android.hardware.usb.host">

应该是:<feature name="android.hardware.usb.host"/>

操作步骤:

  1. adb pull /system/etc/permissions/tablet_core_hardware.xml
  2. 按照Greg-q的指示更新该文件并创建android.hardware.usb.host.xml。
  3. adb push android.hardware.usb.host.xml /system/etc/permissions
  4. adb push tablet_core_hardware.xml /system/etc/permissions
  5. 重新启动。

2

在Micromax A120 Canvas 2手机(KitKat 4.4.2)上完美运行。现在我可以控制我的Arduino!我使用busybox工具来完成所有命令行工作(否则chmod不起作用)。我的步骤(可能有些不必要):

(0) 在我的Windows 8电脑上安装PDAnet驱动程序(http://pdanet.co/a/)。 (1) 使用Vroot(现在称为iRoot)在http://www.mgyun.com/m/en上对手机进行root。非常简单,唯一的问题是su授权/拒绝页面部分是中文,没关系。 (2) 安装busybox和jackpal的Android-Terminal-Emulator(请参见GitHub https://github.com/jackpal/Android-Terminal-Emulator或Play商店https://play.google.com/store/apps/details?id=jackpal.androidterm&hl=en)。

(3)打开终端窗口并成为超级用户:

# su

(4) 文件系统可能是只读的,因此您可能需要重新挂载它:

# mount -o rw,remount -t yaffs2 /

或者

# mount -o rw,remount -t rootfs /

或者

# mount -o rw,remount -t rootfs rootfs /system

请查看http://www.pocketmagic.net/write-on-the-android-read-only-file-system/ 另外,还要看Android 2.3 : Read-Only file system stuck 此外,https://ckirbach.wordpress.com/2012/11/27/how-to-remount-system-as-read-write-in-android/

(5) 使default.prop可读写:

chmod 666 /default.prop

(6)编辑 /default.prop 文件,进行以下更改:
ro.secure=0
ro.debuggable=1
persist.service.adb.enable=1

请查看https://android.stackexchange.com/questions/28653/obtaining-root-by-modifying-default-propro-securehttp://bclary.com/blog/2014/04/14/splitting-and-packing-android-boot-images/

最后,仅为完整起见,如上面的答案所述(https://dev59.com/SWgu5IYBdhLWcg3wpYcj#11992683):

(7)要启用USB主机API支持,您应该添加一个名为android.hardware.usb.host.xml的文件,并包含以下行:

<permissions>
 <feature name="android.hardware.usb.host"/>
</permissions>

放入文件夹中

/system/etc/permissions

在那个文件夹里找到名为的文件。
handheld_core_hardware.xml or tablet_core_hardware.xml 

并添加

<feature name="android.hardware.usb.host" />

进入section。

(8) 重新启动设备。USB主机API应该可以工作。


1

我已经在MK809上使用了Android 4.1 Jelly Bean上的adb命令,命令如下:

adb remount /../../file.xml rw adb push...

使用普通命令时,我没有权限并且文件是只读的。

对不起我的英语不好:P


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接