Mensagem de erro 'java.net.SocketException: falha no soquete: EACCES (permissão negada)'

180

Eu recebo a mensagem de erro

java.net.SocketException: falha no soquete: EACCES (permissão negada)

quando tento aplicar o código abaixo. Essa é a função que eu chamo e me dá essa exceção.

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

E este é o meu arquivo de manifesto:

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

Como posso resolver este problema?

Sniver
fonte
Você está verificando com o dispositivo ou emulador?
Ponmalar

Respostas:

356

Tente com,

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

ao invés de,

<permission  android:name="android.permission.INTERNET"></permission>
user370305
fonte
1
+1. Além disso, embora isso não tenha nada a ver com o problema real, mas: não esqueça de instalar o apk certo depois de fazer essa alteração ... Eu me enganei mantendo outra cópia do .apk em um diretório distinto e esqueceu de substituí-lo pelo novo antes de instalar a partir daí.
N611x007
Funcionou para mim em novembro de 2013. Usando o eclipse, você pode editar o AndroidManifest.xml com o editor sofisticado que possui uma guia Permissões. Adicione uma permissão de uso e escolha essa permissão no menu suspenso.
jjohn
4
importante - a marca de permissão de uso precisa estar antes da marca do aplicativo no arquivo de manifesto. isso é o que consertou isso para mim, pelo menos ..
Ou Gal
39

Tente o seguinte:

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

E você activity namesdeve ser assim com capital letters:

<activity android:name=".Addfriend"/>
    <activity android:name=".UpdateDetails"/>
    <activity android:name=".Details"/>
    <activity android:name=".Updateimage"/>
NagarjunaReddy
fonte
4
- Se você tiver informações adicionais em resposta, poste apenas se você tiver as mesmas respostas já respondidas e apoie essa resposta.
user370305
1
@ user370305 com licença, você quer dizer que ele deve postar apenas as informações adicionais? não sendo nativo, não consigo entender o que você quis dizer, mas gostaria de saber sobre as meta-coisas.
N611x007
32

tente.

<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
fonte
2
Caso alguém ainda esteja se perguntando onde colocá-los: Você pode colocá-los em manifestos / AndroidManifest.xml, antes de <application
Tiw
19

Tente <uses-permission>sair da <application>etiqueta.

Irshu
fonte
7

A desinstalação do aplicativo no dispositivo e a reinstalação corrigiram para mim.

Tentei todas as outras opções, nada. Finalmente encontrei este post . Isso ocorre após adicionar a permissão (abaixo) e limpar a compilação.

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

Pode ser corrigido colocando as linhas no arquivo de manifesto do 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" />

insira a descrição da imagem aqui

Nikimo Jam
fonte
Bem-vinda! Observe que a política é que perguntas e respostas precisem ser em inglês .
zsltg 9/04
0

Adicione o código-fonte ao seu arquivo Java, como abaixo:

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
CoderDream
fonte
5
Esta não é a resposta a esta pergunta, que trata da falta de permissão no manifesto. E esta é uma resposta muito ruim para o problema, é uma resposta, ie NetworkOnMainThreadException.
Laalto
0

Pode ser necessário fazer o AndroidStudio - Compilar - Limpar

Se você atualizou o manifesto através do sistema de arquivos ou do Git, ele não capta as alterações.

David A
fonte
0

Se você estiver usando um emulador para teste, deverá usar <uses-permission android:name="android.permission.INTERNET" />apenas e ignorar <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />.É o trabalho para mim.

Jerin Raj
fonte