我一直在查看示例,而且我还不清楚如何从我的Android应用程序中的usb端口实际读取数据。我喜欢它是事件/意图驱动但我很失落如何做到这一点。我有一个BroadcastReceiver,但我不确定我需要什么样的Intent.action来捕获数据。任何见解都值得赞赏!
编辑:为了澄清我的Android设备是作为USB主机运行的Nexus 9,我正在寻找与Arduino Leonardo进行通信。
Edit2:此时我有一个Arduino草图正在运行,每2秒钟通过串行发送一条消息。我有一个基于我理解的按钮应该在按下时读取缓冲区,但实际上并没有做任何事情。
TextView displayMessages = (TextView)findViewById(R.id.textView);
try
{
byte[] msgBytes = new byte[1000];
connection.bulkTransfer(input, msgBytes, msgBytes.length, TIMEOUT);
String msgString = new String(msgBytes, "UTF-8");// msgBytes.toString();
displayMessages.setText(msgString);
}
catch (Exception e)
{
displayMessages.setText(e.getMessage());
}
结果就是textView为空白。如果我没有进行转换并删除byte []。toString(),我会得到更改每次按下的十六进制值,但我不确定如何解释。
编辑3:随着时间的推移,还有一些信息,我已经禁用了根据Arduino being recognized as keyboard by android显示为HID键盘输入设备的Arduino Leonardo。我只是修改了USBDesc.h以删除" #define HID_ENABLED"。这并没有改变这种情况。与此同时,我还实现了Physicaloid USB库,但事实证明也不成功。我正在调试/转换mik3y的USB-serial-for-android库,但到目前为止还无法用它进行测试。
答案 0 :(得分:0)
您的Android设备可以用作usb host or accessory。 因此,根据您是否将手机用作USB主机,您可以在清单中使用以下意图和权限。
<uses-feature android:name="android.hardware.usb.host" />
<activity ... usb host...>
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data
android:resource="@xml/device_filter"
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
使用xml资源文件提供设备的详细信息。
<?xml version="1.0" encoding="utf-8"?>
<resources>
//details of a device I own
<usb-device vendor-id="22b8" product-id="2e76" class="ff" subclass="ff" protocol="00" />
</resources>
然后设置广播接收器并按照步骤in the API。
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
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) {
//call method to set up device communication
}
} else {
}
}
}
}
};
您需要注册接收器。
mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
mPermissionIntent =
PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(mUsbReceiver, filter);
然后创建您的函数来读写数据。
private Byte[] bytes
private static int TIMEOUT = 0;
private boolean forceClaim = true;
...
UsbInterface intf = device.getInterface(0);
UsbEndpoint endpoint = intf.getEndpoint(0);
UsbDeviceConnection connection = mUsbManager.openDevice(device);
connection.claimInterface(intf, forceClaim);
connection.bulkTransfer(endpoint, bytes, bytes.length, TIMEOUT); //do in another thread
您需要修改此代码以将数据提取到您想要的位置。 This link (android.serverbox)对处理传输线程进行了很好的讨论。
此代码已从android.com文档中获取并部分修改。
同样,将设备设置为a usb accessory.
也有类似的过程