错误信息'java.net.SocketException: socket failed: EACCES (Permission denied)',指的是由于权限被拒绝而导致套接字失败。

194

我在尝试使用下面的代码时收到以下错误信息:

java.net.SocketException: socket failed: EACCES (Permission denied)

这是我调用的函数并导致了这个异常。

public void run() {
    // TODO Auto-generated method stub
    URL myurl = null;

    try {
        myurl = new URL("http://10.0.2.2/list.JSON");
    }
    catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        URLConnection myconn = myurl.openConnection();
        InputStream in = new BufferedInputStream(myconn.getInputStream());
        InputStreamReader reader = new InputStreamReader(in);
        BufferedReader br = new BufferedReader(reader);
        String line;
        StringBuilder sb = new StringBuilder();
        while ((line=br.readLine()) != null)
        {
            sb.append(line);
            //Toast.makeText(getApplicationContext(), "I enter here", Toast.LENGTH_LONG).show();
        }
        jsoncode = sb.toString();
    }
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    threading = true;
    super.run();
}

LogCat

06-30 11:33:21.457: W/System.err(619): java.net.SocketException: socket failed: EACCES (Permission denied)
06-30 11:33:21.467: W/System.err(619):     at libcore.io.IoBridge.socket(IoBridge.java:573)
06-30 11:33:21.467: W/System.err(619):     at java.net.PlainSocketImpl.create(PlainSocketImpl.java:201)
06-30 11:33:21.479: W/System.err(619):     at java.net.Socket.checkOpenAndCreate(Socket.java:663)
06-30 11:33:21.479: W/System.err(619):     at java.net.Socket.connect(Socket.java:807)
06-30 11:33:21.479: W/System.err(619):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:77)
06-30 11:33:21.479: W/System.err(619):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
06-30 11:33:21.479: W/System.err(619):     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
06-30 11:33:21.479: W/System.err(619):     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
06-30 11:33:21.479: W/System.err(619):     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
06-30 11:33:21.487: W/System.err(619):     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
06-30 11:33:21.487: W/System.err(619):     at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
06-30 11:33:21.497: W/System.err(619):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
06-30 11:33:21.497: W/System.err(619):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
06-30 11:33:21.497: W/System.err(619):     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
06-30 11:33:21.497: W/System.err(619):     at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
06-30 11:33:21.497: W/System.err(619):     at com.apk.PItestActivity$connection.run(PItestActivity.java:190)
06-30 11:33:21.507: W/System.err(619): Caused by: libcore.io.ErrnoException: socket failed: EACCES (Permission denied)
06-30 11:33:21.517: W/System.err(619):     at libcore.io.Posix.socket(Native Method)
06-30 11:33:21.517: W/System.err(619):     at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:169)
06-30 11:33:21.527: W/System.err(619):     at libcore.io.IoBridge.socket(IoBridge.java:558)
06-30 11:33:21.527: W/System.err(619):     ... 15 more

这是我的清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.apk"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="14" />
    <permission android:name="android.permission.INTERNET"></permission>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".PItestActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="addfriend"></activity>
        <activity android:name="updateDetails"></activity>
        <activity android:name="Details"></activity>
        <activity android:name="updateimage"></activity>
    </application>
</manifest>

我怎样才能解决这个问题?


你正在使用设备还是模拟器进行检查? - Ponmalar
你正在尝试使用小于1024的端口号,但你没有root权限。 - user207421
我正在使用端口号5200。 - xXJohnRamboXx
你有没有其他在5200端口运行的应用程序?你可以尝试一些更高的随机数来测试。因为你无法创建所需端口的套接字,所以请尝试使用其他端口。 - Roll no1
12个回答

378

尝试以下方法:

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

与其使用,

<permission  android:name="android.permission.INTERNET"></permission>

1
+1。 另外,尽管这与实际问题无关,但是:在进行此更改后,不要忘记安装正确的 apk... 我曾经被自己欺骗了,因为我将另一个副本保留在不同的目录中,并且在从那里安装之前忘记用新的覆盖它。 - n611x007
截至2013年11月,该方法对我有效。在使用Eclipse时,您可以使用带有权限选项卡的高级编辑器编辑AndroidManifest.xml文件。添加一个“使用权限”并从下拉菜单中选择此权限。 - jjohn
4
重要提示:在清单文件中,uses-permission标签需要出现在application标签之前。这个方法对我至少很有效。 - Or Gal

41

试试这个:

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

您的活动名称必须像这样使用大写字母

<activity android:name=".Addfriend"/>
    <activity android:name=".UpdateDetails"/>
    <activity android:name=".Details"/>
    <activity android:name=".Updateimage"/>

4
如果您有额外的信息作为答案,只有当您拥有与已经回答的相同信息时才可以发布,请支持那个答案。 - user370305
1
@user370305 打扰一下,您的意思是他只需要发布额外的信息吗?作为非母语人士,我无法理解您的意思,但我想了解有关元数据的事情。 - n611x007

36

试一试。

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

3
如果有人仍然不知道将它们放在哪里:你可以将它们放在manifests/AndroidManifest.xml中,在<application之前。 - Til

30

尝试添加以下内容:

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

为什么这一开始就会发生? - Panagiss

20

尝试将<uses-permission>标签放在<application>标签外面。


11

卸载设备上的应用程序然后重新安装,这样问题就解决了。

尝试了所有其他选项都不行。最终在这篇帖子中找到了答案。在添加权限(如下)和清理构建之后才得以解决。

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

4

可以通过在Android清单文件中放置这些行来修复它:

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

点击这里查看图片

该图片无法直接显示,需要点击链接查看。

欢迎!请注意,政策规定问题和答案必须用英语 - zsltg

2
尝试添加以下权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


1
如果您正在使用模拟器进行测试,则必须仅使用<uses-permission android:name="android.permission.INTERNET" />,并忽略<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />。这对我有用。

0
将这些源代码添加到您的Java文件中,如下所示:

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());

5
这不是关于清单中缺少权限的问题的答案。而且,这也不是针对NetworkOnMainThreadException问题的好答案。 - laalto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接