为什么我无法在Android上的串口打开/写入?

时间:2015-06-09 20:46:59

标签: android serial-port file-permissions android-4.4-kitkat tty

我编写了一个Android应用程序,该应用程序运行在Android 4.4 Kitkat设备上的自定义内核上,该设备使用Android串行端口API(https://code.google.com/p/android-serialport-api/)来打开串口" / dev / ttyACM0& #34;这是与我的串行设备关联的端口。港口有适当的" 666"权限(crw-rw-rw),应用程序本身甚至有WRITE_EXTERNAL_STORAGE"允许。

但是,即使权限显示正确,当我的应用程序尝试使用库打开所述串行端口时,它也会失败。在我的java代码中,如果我尝试做一个" device.canWrite()"它返回false,而" device.canRead()"返回true。我觉得这是一个更大的权限问题的症状。

如果我使用与串口api /库捆绑在一起的示例apk,我会遇到同样的问题,即应用程序在device.canWrite()失败并抛出SecurityException。

完全相同的代码在最初为其开发的自定义内核ICS设备上运行时成功运行和打开。但是,两者的内核都是由同一个开发人员编写的,至少从表面上看,端口上的权限似乎是相同的。

这可能是我在应用程序代码方面可以解决的问题吗?我已经尝试了一些其他串口库(USBSerial3.0,usb-serial-for-android-master),我似乎遇到了同样的问题。

无论问题出在何处,是否有人对问题可能有什么想法?对内核,应用程序和api进行更改都在桌面上。谢谢。

3 个答案:

答案 0 :(得分:1)

Gabe,Google将SELinux模式从Permissive Mode更改为Android 4.4中的Enforce Mode,默认情况下,应用程序没有(SELinux)访问串行端口的权限。以下是解决此问题的几种方法:  (1)。如果您的设备已植根,则可以将SELinux模式从强制模式切换到允许模式:“su setenforce 0”。每次重启设备时都需要运行该命令。见http://www.xda-developers.com/easily-change-your-android-selinux-mode/  (2)。如果您可以访问设备的内核框架文件     可以更改它们并授予对应用程序的串行端口访问权限。

答案 1 :(得分:1)

从shell运行setenforce 0以禁用SELinux。它对我有用,我能够在tty/ACM0上读/写。

答案 2 :(得分:0)

问题最终发生在SELinux上,而大多数三星系列设备都将其用作安全执行政策。该安全策略已设置为强制执行,因此任何应用程序都无法访问其指定应用程序空间之外的文件,例如我尝试打开的串行端口。

鉴于我们可以更改内核,我们可以向SELinux添加一个策略例外,为我的应用程序提升了特权,从而允许它正确打开端口。