java.net.SocketException: socket non riuscito: EPERM (operazione non consentita)


144

Sto lavorando a un progetto Android Studio con diverse attività. Attualmente sto cercando di leggere l'output da un servlet Java su localhost ma sembra che si blocchi a causa di un'autorizzazione del socket.

Ho realizzato un nuovo progetto, ho utilizzato lo stesso identico codice e ho funzionato perfettamente. Quindi non capisco perché non è disposto a lavorare sul mio progetto.

public class LoginActivity extends AppCompatActivity {


String apiUrl = "http://10.0.2.2:8080/ProyectService/Servlet?action=login";
EditText username;
EditText password;
AlertDialog dialog;
Usuario session;

@Override
public void onCreate(Bundle savedInstanceState) {
    // Inicializacion de ventana
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    getSupportActionBar().hide();

    // Inicializacion de componentes
    username = findViewById(R.id.username);
    password = findViewById(R.id.password);

    // Inicializacion de funcionalidad de botones
    Button button= (Button) findViewById(R.id.login);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            UserLoginTask mAuthTask = new UserLoginTask();
            mAuthTask.execute();
        }
    });

    password = findViewById(R.id.password);
    createAlertDialog("Usuario o Contraseña Incorrectos");
    }

    private void createAlertDialog(String message){
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage(message)
            .setTitle("Error");
    dialog = builder.create();
    }



    // ASYNCRONUS NETWORK PROCESS

    public class UserLoginTask extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
    }


    @Override
    protected String doInBackground(String... params) {

        // implement API in background and store the response in current variable
        String current = "";
        try {
            URL url;
            HttpURLConnection urlConnection = null;
            try {
                url = new URL(apiUrl);
                System.out.println(apiUrl);
                urlConnection = (HttpURLConnection) url
                        .openConnection();

                InputStream in = urlConnection.getInputStream();

                InputStreamReader isw = new InputStreamReader(in);

                int data = isw.read();
                while (data != -1) {
                    current += (char) data;
                    data = isw.read();
                    //System.out.print(current);

                }
                System.out.print(current);
                // return the data to onPostExecute method
                return current;

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
            return "Exception: " + e.getMessage();
        }
        return current;
        }
    }

    protected void onPostExecute(String success) {
        Log.i(success, "");
       //attemptLogin();
    }
}

Mi aspetto che legga i dati ma si blocca su questa riga:

InputStream in = urlConnection.getInputStream();

Questo è l'output dell'errore:

java.net.SocketException: socket failed: EPERM (Operation not permitted)
at java.net.Socket.createImpl(Socket.java:492)
at java.net.Socket.getImpl(Socket.java:552)
at java.net.Socket.setSoTimeout(Socket.java:1180)
at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:143)
at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116)
at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186)
at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:248)
at com.example.controller.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:114)
at com.example.controller.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:93)
at android.os.AsyncTask$3.call(AsyncTask.java:378)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)

Risposte:


395

Risolto: tutto quello che dovevo fare era disinstallare l'app dall'emulatore ed eseguirla di nuovo.


8
ha funzionato anche per me, hai mai scoperto perché stava succedendo in primo luogo?
Vikas Pandey

9
Nel mio caso ho dovuto fornire l'autorizzazione ACCESS_NETWORK_STATE. Aggiungi <uses-permission android: name = "android.permission.ACCESS_NETWORK_STATE" /> a manifest. E disinstalla anche
sk md

3
Anch'io. È strano che la domanda sia così giovane. Forse questo è un bug.
user1511417

1
L'applicazione rimossa da un emulatore e l'installazione di nuovo ha risolto il mio problema, grazie. Sembra che Firebase memorizzi qualcosa nel filesystem e lo riutilizzi, suppongo che anche i dati chiari dell'applicazione risolveranno un problema.
Onregs

1
forse i permessi sono già memorizzati nella cache e rovinarli ancora e ancora non significa aggiornare i permessi e invece di aggiornare solo i file src. che ha aiutato la reinstallazione.
Atif AbbAsi

38

basta disinstallare l'app dall'emulatore, quindi eseguire di nuovo e funzionerà, ho avuto lo stesso problema

per disinstallare l'app, esegui il tuo progetto quando viene visualizzato il messaggio "l'applicazione è stata interrotta", fai clic su "info app" quindi disistalla


1
Non so come, ma funziona. Pubblicazione a dicembre 2019. Anche se funziona, curioso di sapere perché.
Rajkiran

30

Prima di tutto devi cambiare il tuo manifest .xml di Android Ma dopo questa azione devi disinstallare l'applicazione ed eseguirla di nuovo. https://developer.android.com/training/basics/network-ops/connecting

e codifica qui:

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

in AndroidManifest.xml


2
Vero, anche se è già impostato e si ottiene ancora lo stesso errore - fai come suggerito sopra - elimina l'app sul dispositivo e installala di nuovo.
Vladislav Varslavans il

11

Ho dovuto disinstallare l'app dall'emulatore e poi tutto ha iniziato a funzionare. Avevo solo bisogno del seguente permesso su AndroidManifest.xml

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

9
  1. Aggiungi l'autorizzazione ACCESS_NETWORK_STATE nel manifest
  2. Emulatore di reinstallazione

2

Impostato android:usesCleartextTraffic="true"nel file manifest. Aggiungi l'autorizzazione INTERNET. Disinstalla l'app e installala di nuovo.


0

Se qualcuno ha ancora questo problema, l'ho riscontrato quando ho usato VPN e ho provato a connettermi al wifi mentre il cellulare era acceso. Stavo usando il client VPN Anyconnect. La soluzione è abilitare il consentire bypass che ti consentirà di associare un socket a una rete specifica se questo è ciò che stai cercando.

AnyConnect utilizza allowBypass solo se è configurato nelle restrizioni gestite (da EMM), tramite questa chiave: vpn_connection_allow_bypass.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.