11

我正在尝试编写一个与 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 应用程序已经连接并占用了套接字?

顺便说一句,我最初尝试使用这些框架,但遇到了一大堆错误,主要是关于 java 和未知的第三方类,所以在几天的努力后我放弃了。我也有 STFW 和这个网站 - 围绕这个问题跳了很多,但没有具体的建议。

非常感谢任何帮助。-约翰

4

2 回答 2

8

在 rild 套接字的 java 端是com.android.internal.telephony.RIL.java的一个实例,它由com.android.phone.PhoneApp.java拥有。PhoneApp 是一个持久的应用程序,毫不奇怪,它提供了电话功能。禁用 PhoneApp 应该会终止任何 java 端对 rild 套接字的使用。

您可能还想尝试连接到未使用的“rild-debug”(但可能会被 ril-daemon 忽略)。

顺便说一句-您可以通过执行logcat -b radio来查看 RIL 层之间的通信。

如果您想出解决方法,请回帖。

于 2012-02-16T16:16:02.030 回答
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 配对。

于 2013-11-27T10:14:46.743 回答