2011-08-15 4 views
0

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); 

하는 동안 나는 가지고 :

핑 : ICMP 열린 소켓 : 작업 나는 또한 실행하려고

을 할 수 없습니다 앱의 또 다른 프로그램 (안드로이드 스크린에 이미지를 보여줌 - 서핑 플랭어 싱크). 따라서, android.permission.ACCESS_SURFACE_FLINGER을 매니페스트 파일에 포함 시켰습니다. 그러나, 그것은 표면 수세미 싱크에 표시 할 수 없었습니다.

그래서 이러한 권한이 이러한 외부 프로그램에 전달되지 않는다고 생각합니다. 이것을 달성 할 수있는 방법이 있습니까? 이 C 기반 프로그램을 Java로 변환하고 싶지 않습니다.

답변

2

별도의 실행 파일은 공식적으로 지원되지 않지만 여기에는 문제가 없습니다.

인터넷 사용 권한은 유닉스 그룹 멤버쉽을 통해 구현되며 실행 응용 프로그램과 동일한 사용자 ID로 실행되므로 독립 실행 파일을 추적해야합니다. 로컬 터미널 응용 프로그램이 명령 줄을 사용할 수있게하는 이유입니다 셸에서 네트워킹 응용 프로그램. 예를 들어 권한이있는 포트 나 이미 사용중인 포트에 바인딩하려는 것과 같은 다른 문제가있을 수 있습니다. 기술적으로 권한 검사는 바인딩이 아닌 AF_INET 소켓 생성에 대한 것입니다. 따라서 오류 메시지가 정확하다면 오류가 부정확 해지고 이벤트 체인에 무언가가 있음을 나타낼 수 있지만 인터넷 권한에 대한 부족을 나타내지는 않습니다 바인딩 된 소켓으로 연결되는 것은 실패합니다).

ICMP 및 ping은 흥미로운 상황을 나타냅니다. 제 3 자 애플 리케이션이 NET_RAW를 얻을 수 있다고 생각하지 않습니다. 대신 setgid 비트가 net_raw 그룹을 주식 ping 실행 파일에 제공하는 데 사용됩니다. 자신 만의 앱을 사용하는 경우 net_raw 그룹을 사용하지 않으면 작동하지 않을 것입니다.

iirc ACCESS_SURFACE_FLINGER는 타사 응용 프로그램에서 사용 가능한 권한이 아닙니다.

관련 문제