我正在尝试使用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接收器)。所以,我在清单文件中包含了android.permission.ACCESS_SURFACE_FLINGER
。但是,它无法在surfaceflinger接收器上显示。
所以,我觉得这些权限不会传递给这些外部程序。有没有办法实现这个目标?我不想将这些基于C的程序转换为Java。
答案 0 :(得分:3)
单独的可执行文件不受官方支持,但这可能不是你的问题。
Internet权限是通过unix组成员身份实现的,它应该跟踪独立的可执行文件,因为它们与启动应用程序运行的用户ID相同 - 这就是为什么,例如本地终端应用程序可以让您使用命令行网络应用程序在其shell中。因此,您可能还有其他一些问题,例如尝试绑定到特权端口或已经在使用的端口。从技术上讲,权限检查是创建AF_INET套接字而不是绑定,因此如果您的错误消息准确无误,则表明缺少Internet权限(尽管错误可能不准确,并指示事件链中的某些内容导致绑定套接字失败)。
ICMP和ping提出了一个有趣的情况;我不认为第三方应用程序可以获得NET_RAW,因此setgid位用于将net_raw组赋予库存ping可执行文件 - 如果您使用自己的,可能不会有这个并且不会工作。
iirc ACCESS_SURFACE_FLINGER不是第三方应用程序可用的权限。