Android-приложение: разрешение доступа к сокету для программы - PullRequest
1 голос
/ 15 августа 2011

Я пытаюсь разработать приложение, которое вызывает внешнюю программу (написанную на C), используя метод Runtime.getRuntime (). Exec.Эта программа в основном является сервером RTSP на основе gstreamer, и она хорошо работает, если я запускаю из командной строки 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 - сток поверхности).Итак, я включил android.permission.ACCESS_SURFACE_FLINGER в файл манифеста.Однако он не смог отобразиться на приемнике Surfaceflinger.

Итак, у меня есть ощущение, что эти разрешения не передаются этим внешним программам.Есть ли способ добиться этого?Я не хочу конвертировать эти программы на C для Java.

1 Ответ

3 голосов
/ 15 августа 2011

Отдельные исполняемые файлы официально не поддерживаются, хотя, возможно, это не ваша проблема.

Разрешение на доступ к Интернету реализуется через членство в группе Unix, и оно должно отслеживать автономные исполняемые файлы, поскольку они работают с тем же идентификатором пользователя, что изапускающее приложение - вот почему, например, приложение локального терминала позволяет вам использовать сетевые приложения командной строки в своей оболочке.Так что, возможно, у вас есть другая проблема, например, попытка привязки к привилегированному порту или порту, который уже используется.Технически проверка прав доступа происходит при создании сокетов AF_INET, а не при привязке, поэтому, если ваше сообщение об ошибке является точным, это не указывает на отсутствие разрешения на доступ в Интернет (хотя ошибка может быть неточной и указывать на что-то в цепочке событийсбой при подключении к связанному сокету).

ICMP и ping представляют интересную ситуацию;Я не думаю, что сторонние приложения могут получить NET_RAW, так что вместо этого бит setgid используется для передачи группы net_raw исполняемому файлу ping - если вы используете свой собственный, он, вероятно, не будет иметь этого и не будет работать.

iirc ACCESS_SURFACE_FLINGER не является разрешением, доступным для сторонних приложений.

...