Message d'erreur «java.net.SocketException: socket failed: EACCES (Permission refusée)»

181

Je reçois le message d'erreur

java.net.SocketException: échec de la socket: EACCES (autorisation refusée)

lorsque j'essaye d'appliquer le code ci-dessous. C'est la fonction que j'appelle et me donne cette exception.

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

Et voici mon fichier manifeste:

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

Comment puis-je résoudre ce problème?

Sniver
la source
Vérifiez-vous avec l'appareil ou l'émulateur?
Ponmalar

Réponses:

361

Essayez avec,

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

au lieu de,

<permission  android:name="android.permission.INTERNET"></permission>
user370305
la source
1
+1. Aussi, bien que cela n'ait rien à voir avec le problème réel, mais: n'oubliez pas d'installer le bon apk après avoir effectué ce changement ... Je me suis trompé en gardant une autre copie du .apk dans un répertoire distinct j'ai oublié de l'écraser avec le nouveau avant de l'installer à partir de là.
n611x007 du
A travaillé pour moi à partir de novembre 2013. En utilisant eclipse, vous pouvez modifier le fichier AndroidManifest.xml avec l'éditeur sophistiqué qui a un onglet Permissions. Ajoutez une autorisation d'utilisation et choisissez cette autorisation dans le menu déroulant.
jjohn
4
important - la balise uses-permission doit se trouver avant la balise d'application dans le fichier manifeste. c'est ce qui l'a résolu pour moi au moins ..
Ou Gal
39

Essaye ça:

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

Et vous activity namesdevez être comme ça avec capital letters:

<activity android:name=".Addfriend"/>
    <activity android:name=".UpdateDetails"/>
    <activity android:name=".Details"/>
    <activity android:name=".Updateimage"/>
NagarjunaReddy
la source
4
- Si vous avez des informations supplémentaires en réponse, ne postez que si vous avez déjà répondu, puis soutenez cette réponse.
user370305
1
@ user370305 excusez-moi, voulez-vous dire qu'il ne devrait publier que les informations supplémentaires? n'étant pas natif, je ne comprends pas ce que vous vouliez dire mais j'aimerais en savoir plus sur les méta-choses.
n611x007 du
32

essayez-le.

<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" />
Neeraj Singh
la source
2
Au cas où quelqu'un se demanderait encore où les mettre: Vous pouvez les mettre dans les manifestes / AndroidManifest.xml, avant <application
Tiw
19

Essayez de <uses-permission>sortir du <application>tag.

Irshu
la source
7

La désinstallation de l'application sur l'appareil, puis la réinstallation l'ont corrigé pour moi.

J'ai essayé toutes les autres options, rien. Enfin trouvé ce post . C'est après l'ajout de l'autorisation (ci-dessous) et le nettoyage de la version.

<uses-permission android:name="android.permission.INTERNET"/>
Gibolt
la source
3

Il peut être résolu en plaçant les lignes dans le fichier manifeste 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" />

entrez la description de l'image ici

Nikimo Jam
la source
Bienvenue! Veuillez noter que la politique est que les questions et réponses doivent être en anglais .
zsltg le
0

Ajoutez ce code source à votre fichier Java comme ci-dessous:

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
CoderDream
la source
5
Ce n'est pas la réponse à cette question qui concerne l'absence d'autorisation dans le manifeste. Et c'est une très mauvaise réponse au problème auquel il est une réponse, c'est-à-dire NetworkOnMainThreadException.
laalto
0

Vous devrez peut-être faire AndroidStudio - Build - Clean

Si vous avez mis à jour le manifeste via le système de fichiers ou Git, il ne prendra pas en compte les modifications.

David A
la source
0

Si vous utilisez un émulateur pour les tests, vous devez utiliser <uses-permission android:name="android.permission.INTERNET" />uniquement et ignorer <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />. Cela fonctionne pour moi.

Jerin Raj
la source