我正在尝试编写一个与rild交谈的应用程序。是的,我知道这在政治上是不正确的,但它是一个嵌入式工业遥测应用程序,所以我不关心用户体验,可移植性和所有这些。
问题是,当我尝试连接时,我得到一个java.io“Permission denied”异常。有人能帮助我吗?
手机(Nexus One)植根于Cyanogenmod 7,该应用程序使用Market的“SuperUser”应用程序以超级用户身份运行。
我的代码(缩写):
try {
mSocket = new LocalSocket();
mSockAddr = new LocalSocketAddress( "rild", LocalSocketAddress.Namespace.RESERVED );
mSocket.connect( mSockAddr );
}
catch( Exception e ) {
dbg.p( "connect failed: "+e );
}
我在/ dev / socket中看到了rild(和rild-debug)套接字。
srw-rw---- 1 root radio 0 Feb 13 19:14 rild
srw-rw---- 1 radio system 0 Feb 13 19:14 rild-debug
Dialer应用程序是否已连接并占用套接字?
BTW我最初尝试使用这些框架但是得到了一大堆关于java和第三方类别未知的错误,所以我放弃了几天后就放弃了。我也是STFW和这个网站 - 围绕这个问题跳舞,但没有具体的建议。任何帮助非常感谢。 -John
答案 0 :(得分:8)
在rild套接字的java端是 com.android.internal.telephony.RIL.java 的一个实例,它由 com.android.phone.PhoneApp.java拥有。 。 PhoneApp是一款持久性应用程序,毫不奇怪,它提供了手机功能。禁用PhoneApp应该杀死rild套接字的任何java端使用。
您也可能想尝试连接到“rild-debug”,这是未使用的(但可能被ril-daemon忽略)。
BTW - 您可以通过 logcat -b radio 查看RIL图层之间的通信。
如果您想出一个解决方法,请回复。
答案 1 :(得分:1)
在Android的最新版本中(可能在早期版本中),rild-debug
并不意味着接受全范围的命令;只接受预定义的命令。
在这里查看ril.cpp;
static void debugCallback (int fd, short flags, void *param)
...
case 0:
LOGI ("Connection on debug port: issuing reset.");
issueLocalRequest(RIL_REQUEST_RESET_RADIO, NULL, 0);
break;
case 1:
LOGI ("Connection on debug port: issuing radio power off.");
data = 0;
issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int));
// Close the socket
close(s_fdCommand);
s_fdCommand = -1;
break;
UPD :此外,RIL请求会逐步编号,并且通过发布一个非系列事件可以很容易地有效地打破ril / phoneapp配对。