ข้อความแสดงข้อผิดพลาด 'java.net.SocketException: ซ็อกเก็ตล้มเหลว: EACCES (ปฏิเสธการอนุญาต)'


180

ฉันได้รับข้อความแสดงข้อผิดพลาด

java.net.SocketException: ซ็อกเก็ตล้มเหลว: EACCES (การอนุญาตถูกปฏิเสธ)

เมื่อฉันพยายามใช้รหัสด้านล่าง นี่คือฟังก์ชั่นที่ฉันเรียกและให้ข้อยกเว้นนี้แก่ฉัน

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

คำตอบ:


357

ลองด้วย

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

แทน,

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

1
+1 นอกจากนี้แม้ว่ามันจะไม่เกี่ยวข้องกับปัญหาที่เกิดขึ้นจริง แต่: อย่าลืมติดตั้งapk ที่เหมาะสมหลังจากที่คุณทำการเปลี่ยนแปลงนี้ ... ฉันหลอกตัวเองด้วยการเก็บสำเนา. apk ในไดเรกทอรีที่แตกต่างกันและ ลืมที่จะเขียนทับมันด้วยใหม่ก่อนที่จะติดตั้งจากที่นั่น
n611x007

ทำงานให้ฉันตั้งแต่พฤศจิกายน 2013 การใช้ eclipse คุณสามารถแก้ไข AndroidManifest.xml ด้วยโปรแกรมแก้ไขแฟนซีที่มีแท็บการอนุญาต เพิ่มสิทธิ์การใช้งานและเลือกการอนุญาตนี้จากเมนูแบบเลื่อนลง
jjohn

4
สำคัญ - แท็ก use-permission ต้องอยู่ก่อนแท็กของแอปพลิเคชันในไฟล์รายการ นั่นคือสิ่งที่แก้ไขสำหรับฉันอย่างน้อย ..
หรือ Gal

39

ลองสิ่งนี้:

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

และคุณactivity namesต้องเป็นเช่นนี้ด้วยcapital letters:

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

4
- หากคุณมีข้อมูลเพิ่มเติมในคำตอบให้โพสต์เฉพาะในกรณีที่คุณมีคำตอบเดียวกันแล้วสนับสนุนคำตอบนั้น
user370305

1
@ user370305 ขอโทษฉันหมายความว่าเขาควรโพสต์ข้อมูลเพิ่มเติมหรือไม่ ไม่ใช่คนพื้นเมืองฉันไม่สามารถเข้าใจความหมายของคุณได้ แต่อยากรู้เกี่ยวกับเมตาดาต้า
n611x007

32

ลองมัน.

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

2
ในกรณีที่ใครบางคนยังคงสงสัยว่าจะวางที่ใด: คุณสามารถใส่ไว้ในรายการ / AndroidManifest.xml ก่อนหน้า <application
Tiw


7

ถอนการติดตั้งแอปบนอุปกรณ์จากนั้นทำการติดตั้งใหม่แก้ไขให้ฉัน

ลองใช้ตัวเลือกอื่นทั้งหมดแล้วไม่มีอะไรเลย ในที่สุดก็พบโพสต์นี้ นี่คือหลังจากเพิ่มการอนุญาต (ด้านล่าง) และการสร้างการทำความสะอาด

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

2

สามารถแก้ไขได้โดยการวางบรรทัดในไฟล์รายการ 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

0

เพิ่มซอร์สโค้ดเหล่านั้นไปยังไฟล์ Java ของคุณดังต่อไปนี้:

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

5
นี่ไม่ใช่คำตอบสำหรับคำถามนี้ซึ่งเกี่ยวกับการอนุญาตที่ขาดหายไปในรายการ NetworkOnMainThreadExceptionและนี่คือคำตอบที่ดีมากกับปัญหาที่มันเป็นคำตอบคือ
laalto

0

คุณอาจต้องทำ AndroidStudio - Build - Clean

หากคุณอัปเดตรายการผ่านระบบไฟล์หรือ Git ระบบจะไม่รับการเปลี่ยนแปลง


0

หากคุณใช้อีมูเลเตอร์สำหรับการทดสอบคุณต้องใช้<uses-permission android:name="android.permission.INTERNET" />อย่างเดียวและเพิกเฉย<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />มันใช้ได้ผลสำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.