1

我正在尝试使用 Runtime.getRuntime().exec 方法开发一个调用外部程序(用 C 编写)的应用程序。这个程序基本上是一个基于 gstreamer 的RTSP服务器,如果我从 Android 命令提示符运行,它运行良好。但是,当我从应用程序运行程序时,我收到以下错误。

绑定套接字失败(权限被拒绝)

我已经在我的 AndroidManifest.xml 文件中提供了网络访问权限。

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

我也试过这个:

String cmd = "ping localhost";
Runtime.getRuntime().exec(cmd);

我得到了:

ping: icmp open socket: 不允许操作

我还尝试从应用程序运行另一个程序(它在 Android 屏幕上显示图像 - surfaceflinger sink)。所以,我包含android.permission.ACCESS_SURFACE_FLINGER在清单文件中。但是,它无法在surfaceflinger sink 上显示。

所以,我有一种感觉,这些权限并没有传递给这些外部程序。有没有办法做到这一点?我不想将这些基于 C 的程序转换为 Java。

4

1 回答 1

3

官方不支持单独的可执行文件,尽管这可能不是您的问题。

Internet 权限是通过 unix 组成员身份实现的,它应该跟踪独立的可执行文件,因为它们以与启动应用程序相同的用户 ID 运行 - 这就是为什么,例如,本地终端应用程序可以让您在其中使用命令行网络应用程序壳。因此,也许您还有其他问题,例如尝试绑定到特权端口或已在使用的端口。从技术上讲,权限检查是在创建 AF_INET 套接字时而不是在绑定时进行的,因此如果您的错误消息是准确的,则并不表示缺少 Internet 权限(尽管该错误可能不准确并且表明事件链中的某些内容导致绑定套接字失败)。

ICMP 和 ping 呈现出一个有趣的情况;我不认为第 3 方应用程序可以获得 NET_RAW,因此 setgid 位用于将 net_raw 组提供给股票 ping 可执行文件 - 如果您使用自己的,它可能不会有,也不会工作。

iirc ACCESS_SURFACE_FLINGER 不是第 3 方应用程序可用的权限。

于 2011-08-15T19:23:37.273 回答