java.net.SocketException: socket falló: EPERM (Operación no permitida)

143

Estoy trabajando en un proyecto de Android Studio con varias actividades. Actualmente estoy tratando de leer la salida de un Servlet de Java en localhost pero parece estar fallando debido a un permiso de socket.

Hice un nuevo proyecto, usé exactamente el mismo código y funcionó perfectamente. Entonces no entiendo por qué no está dispuesto a trabajar en mi proyecto.

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();
    }
}

Espero que lea los datos, pero se bloquea en esta línea:

InputStream in = urlConnection.getInputStream();

Esta es la salida del error:

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)
Aaron Villalobos
fuente

Respuestas:

392

Resuelto: todo lo que tenía que hacer era desinstalar la aplicación del emulador y volver a ejecutarla.

Aaron Villalobos
fuente
8
funcionó para mí también, ¿alguna vez descubriste por qué estaba sucediendo en primer lugar?
Vikas Pandey
9
En mi caso, tuve que proporcionar el permiso ACCESS_NETWORK_STATE. Agregue <uses-permission android: name = "android.permission.ACCESS_NETWORK_STATE" /> al manifiesto. Y desinstalar también
sk md
3
Igual que aquí. Es extraño que la pregunta sea tan joven. Tal vez esto es un error.
user1511417
1
La aplicación eliminada de un emulador y la instalación nuevamente resolvieron mi problema, gracias. Parece que Firebase almacena en caché algo en el sistema de archivos y lo reutiliza, supongo que los datos claros de la aplicación también resolverán un problema.
Onregs
1
tal vez los permisos ya están en caché y arruinarlo una y otra vez no es actualizar el permiso y en lugar de actualizar solo los archivos src. eso ayudó a la reinstalación.
Atif AbbAsi
38

simplemente desinstale la aplicación del emulador, vuelva a ejecutarla y funcionará. Tuve el mismo problema

para desinstalar la aplicación, ejecute su proyecto cuando aparezca el mensaje "la aplicación se detuvo", haga clic en "información de la aplicación" y luego desinstale

John Alexander
fuente
1
No sé cómo, pero esto funciona. Publicación en diciembre de 2019. Aunque esto funciona, es curioso saber por qué.
Rajkiran
30

En primer lugar, debe cambiar su manifiesto de Android .xml. Pero después de esta acción, debe desinstalar la aplicación y volver a ejecutarla. https://developer.android.com/training/basics/network-ops/connecting

y codifique aquí:

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

en AndroidManifest.xml

Archil Labadze
fuente
2
Es cierto, aunque si eso ya está configurado y sigue recibiendo el mismo error, haga lo sugerido anteriormente, elimine la aplicación en el dispositivo e instálela nuevamente.
Vladislav Varslavans
11

Tuve que desinstalar la aplicación del emulador y luego todo comenzó a funcionar. Solo necesitaba el siguiente permiso en AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
Juan Cabello
fuente
9
  1. Agregar permiso ACCESS_NETWORK_STATE en manifiesto
  2. Emulador de reinstalación
Habib Adnan
fuente
2

Establecer android:usesCleartextTraffic="true"en el archivo de manifiesto. Agrega el permiso INTERNET. Desinstale la aplicación y luego vuelva a instalarla.

Ssenyonjo
fuente
0

Si alguien todavía tiene este problema, lo encontré cuando usé VPN e intenté conectarme a wifi mientras el celular estaba encendido. Estaba usando el cliente Anyconnect VPN. La solución es habilitar el bypass de permiso que le permitirá vincular un socket a una red específica si esto es lo que está buscando.

AnyConnect solo usa allowBypass si está configurado en sus restricciones administradas (por EMM), a través de esta clave: vpn_connection_allow_bypass.

ovidiur
fuente