2010-04-22 135 views
6

我在使用Android時看到了一些關於SocketException的問題,但是他們都沒有覆蓋我在清單中指定的INTERNET權限的BindException。請求INTERNET權限的BindException

這裏是我的清單的一部分:

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

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

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

這裏是我的logcat輸出的相關部分:

 
04-22 14:49:06.117: DEBUG/MyLibrary(4844): Address to bind: 192.168.1.14 port: 843 
04-22 14:49:06.197: WARN/System.err(4844): java.net.BindException: Permission denied (maybe missing INTERNET permission) 
04-22 14:49:06.207: WARN/System.err(4844):  at org.apache.harmony.luni.platform.OSNetworkSystem.socketBindImpl(Native Method) 
04-22 14:49:06.207: WARN/System.err(4844):  at org.apache.harmony.luni.platform.OSNetworkSystem.bind(OSNetworkSystem.java:107) 
04-22 14:49:06.217: WARN/System.err(4844):  at org.apache.harmony.luni.net.PlainSocketImpl.bind(PlainSocketImpl.java:184) 
04-22 14:49:06.217: WARN/System.err(4844):  at java.net.ServerSocket.bind(ServerSocket.java:414) 
04-22 14:49:06.227: WARN/System.err(4844):  at org.apache.harmony.nio.internal.ServerSocketChannelImpl$ServerSocketAdapter.bind(ServerSocketChannelImpl.java:213) 
04-22 14:49:06.227: WARN/System.err(4844):  at java.net.ServerSocket.bind(ServerSocket.java:367) 
04-22 14:49:06.237: WARN/System.err(4844):  at org.apache.harmony.nio.internal.ServerSocketChannelImpl$ServerSocketAdapter.bind(ServerSocketChannelImpl.java:283) 
04-22 14:49:06.237: WARN/System.err(4844):  at mylibrary.net.PolicyConnection$PolicyServerWorker.(PolicyConnection.java:201) 

我真的希望這是一個簡單的問題,不是由事實複雜化綁定發生在小於1024的端口上的工作線程內。

更新

看起來好像這是一個特權端口問題,任何人都知道如何在Android中綁定到低於1024的端口?


    SelectorProvider provider = SelectorProvider.provider(); 
    try { 
     ServerSocketChannel channel = provider.openServerSocketChannel(); 
     policySocket = channel.socket(); 
     Log.d("MyLibrary", "Address to bind: " + device.getAddress().getAddress() + " port: 843");    
     InetSocketAddress addr = new InetSocketAddress(InetAddress.getByName(device.getAddress().getAddress()), 843); 
     policySocket.bind(addr); 
     policySocket.setReuseAddress(true); 
     policySocket.setReceiveBufferSize(256); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

回答

27

人知道如何綁定到端口下 比1024的Android?

要麼根您的手機,修改固件,或不要綁定到低於1024的端口。這不僅僅是Android的東西,而是Linux的東西。

+0

似乎不幸言:( – 2010-04-22 23:13:47

+0

嗯...如何在紮根的環境做到這一點。我們建立我們自己的Android平臺的嵌入式設備。我需要什麼權限才能讓android服務獲得綁定到端口24的權限? – videoguy 2011-10-24 02:43:38

+0

@videoguy:沒有權限,進程必須以root用戶身份運行(或者作爲一個擁有管理員權限的用戶帳戶運行) – CommonsWare 2011-10-24 05:30:04

-2

嘗試添加權限android.permission.INTERNET對 它爲我工作