已请求 INTERNET 权限的 BindException [英] BindException with INTERNET permission requested

查看:18
本文介绍了已请求 INTERNET 权限的 BindException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在使用 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 端口:84304-22 14:49:06.197: WARN/System.err(4844): java.net.BindException: 权限被拒绝(可能缺少 INTERNET 权限)04-22 14:49:06.207: WARN/System.err(4844): 在 org.apache.harmony.luni.platform.OSNetworkSystem.socketBindImpl(Native Method)04-22 14:49:06.207: WARN/System.err(4844): 在 org.apache.harmony.luni.platform.OSNetworkSystem.bind(OSNetworkSystem.java:107)04-22 14:49:06.217: WARN/System.err(4844): 在 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): 在 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): 在 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();尝试 {ServerSocketChannel channel = provider.openServerSocketChannel();policySocket = channel.socket();Log.d("MyLibrary", "绑定地址:" + device.getAddress().getAddress() + " 端口:843");InetSocketAddress addr = new InetSocketAddress(InetAddress.getByName(device.getAddress().getAddress()), 843);policySocket.bind(addr);policySocket.setReuseAddress(true);policySocket.setReceiveBufferSize(256);} 捕获(异常 e){e.printStackTrace();}

解决方案

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

要么root你的手机,修改固件,要么不绑定低于1024的端口.这是Linux的事情而不是Android的事情.

I have seen several questions regarding SocketException when using Android, but none of them cover the BindException that I get even with the INTERNET permission specified in my manifest.

Here is part of my manifest:

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

Here is the relevant portion of my LogCat output:

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)

I Really hope this is a simple problem and not something complicated by the fact that the binding is occurring within a worker thread on a port less than 1024.

Update

Looks as if this is a privileged port issue, anyone know how to bind to ports lower than 1024 in Android?


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

解决方案

anyone know how to bind to ports lower than 1024 in Android?

Either root your phone, modify the firmware, or don't bind to ports lower than 1024. That's a Linux thing more than an Android thing.

这篇关于已请求 INTERNET 权限的 BindException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆