【问题标题】:BindException with INTERNET permission requested请求 INTERNET 权限的 BindException
【发布时间】:2011-02-11 07:04:33
【问题描述】:

我在使用 Android 时看到了几个关于 SocketException 的问题,但没有一个涵盖我在清单中指定的 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): 绑定地址: 192.168.1.14 端口: 843 04-22 14:49:06.197: WARN/System.err(4844): java.net.BindException: 权限被拒绝(可能缺少 INTERNET 权限) 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): 在 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): 在 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): 在 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();
    }

【问题讨论】:

    标签: java android sockets bind


    【解决方案1】:

    任何人都知道如何绑定到较低的端口 在 Android 中超过 1024?

    root 你的手机,修改固件,或者不要绑定到低于 1024 的端口。这是 Linux 的东西,而不是 Android 的东西。

    【讨论】:

    • 嗯...如何在根环境中执行此操作。我们为嵌入式设备构建了自己的安卓平台。我需要向 android 服务授予什么权限才能获得绑定端口 24 的权限?
    • @videoguy:没有权限。该进程必须以 root 身份运行(或者可能以具有管理员权限的用户帐户身份运行)。
    • 很遗憾,但是如何解决这种情况。在我的硬件中,他们使用的是 1002?提前致谢
    • @sandeepmaaram:大概,为您的硬件创建固件的人有一个使用 1002 端口以 root 权限运行的进程。如果您对此有疑问,请先与硬件制造商交谈。
    • @CommonsWare 我用signapk.jar 签署了我的应用程序并将我的应用程序放入system/priv-app 并授予它所有755 权限。但仍然无法播放端口低于 1024 的流!
    【解决方案2】:

    尝试添加权限 android.permission.INTERNET 它对我有用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 2018-07-29
      • 2015-08-23
      • 1970-01-01
      • 2021-11-01
      相关资源
      最近更新 更多