2013-07-14 92 views
0

我正在开发一款Android应用程序,我想与通过USB连接的设备进行通信。该设备始终提供数据。这些数据在android linux外壳程序中可见。Android应用程序通过USB连续接收数据

我的目标是在我的应用程序中查看这些数据,然后通过服务将它们交付给其他应用程序。

所以我的问题是:我可以“打开”从我的Android应用程序连接到USB端口,以便即时通讯接收我的应用程序中的数据,这是由USB设备发送的?如果是,代码将如何显示?

*编辑

谢谢您的回答,应用程序本身并不在命令行运行了。所以它不再是可执行文件,而是一个共享库,由我的Android应用程序加载。 它以前做过,但我想能够在我的应用程序中使用NDK方法启动连接,以便能够在我的应用程序本身中查看数据。所以我试图看看一个连接是否已经打开。

我已经添加了一些功能,我的代码,所以我可以看到,如果USB连接打开,我有权限,该USB设备。

UsbManager.hasPermission(device) 

返回true,因为我正在使用itent过滤器。

UsbManager.openDevice(device) 

返回一个UsbDeviceConnection,所以我似乎有权使用该设备。

到目前为止,我还没有能够通过usb-device接收总线连接,并且当然要么获得该设备的数据输入。

因为我的本地代码已经有一段时间了(true) - 方法只使用回调函数将数据发送到我的应用程序实际发送数据时通过我的USB设备我想保持工作在我的C代码完成。

我的应用程序应该做的唯一工作就是打开总线连接一次,然后准备从c代码回调。

这可能吗?

+0

通常我会问,如果另一端是“USB设备”或“USB主机”但听起来你已经有了一个可以和它一起工作的命令行工具,所以我们也许可以跳过这一点,我会问一下命令行工具的功能。如果没有设备节点权限问题,您可以将该工具重构为JNI库并将其运行在Android服务之外;如果存在权限问题,则需要启动特权本地守护程序并通过linux风格的IPC与其通信。或者,您可以创建自定义组ID以拥有设备节点,并将其绑定到自定义的Android权限。 –

+0

该设备是一个CAN总线 - USB设备。我需要打开一次连接。之后,我的c代码中的一段时间(true)方法使用回调函数将数据发送到我的应用程序。通常做回调的方法只是在命令行上显示数据。如果我将代码更改为可执行文件,则工作正常。我认为它是一个“USB设备”,因为它只是通过USB发送CAN总线数据到我的Android设备。我实际上在想,如果回调甚至需要任何权限,或者我只需要授权打开我的CAN总线。 – DrDieHard

回答

0

如果您有在命令行上运行的应用程序,则可以实际在应用程序内运行命令行。请参阅Process类和ProcessBuilder文档以获取完整详细信息。给出的例子是下面

运行/系统/斌/ Ping命令Ping android.com:

Process process = new ProcessBuilder() 
     .command("/system/bin/ping", "android.com") 
     .redirectErrorStream(true) 
     .start(); 
    try { 
    InputStream in = process.getInputStream(); 
    OutputStream out = process.getOutputStream(); 

    readStream(in); 

    finally { 
    process.destroy(); 
    } 
} 
+1

也许吧。但这很少是最好的解决方案。只有几个原因可以使用它 - 缺乏资源,授权防火墙,或者最常见的,需要在轻度黑客设备(使用自定义“su”工具)上将辅助进程作为更加特权的用户标识运行,而不是更多涉及的工程项目以某种方式处理特定资源的许可。 –

相关问题