java. net. SocketException: échec du socket: EPERM (Opération non autorisée)


Je travaille sur un projet Android Studio avec plusieurs activités. J'essaie actuellement de lire la sortie d'un servlet Java sur localhost mais il semble se bloquer en raison d'une autorisation de socket.

J'ai fait un nouveau projet, j'ai utilisé exactement le même code et j'ai parfaitement fonctionné. Je ne comprends donc pas pourquoi je ne suis pas prêt à travailler sur mon projet.

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

Je m'attends à ce qu'il lise les données mais il se bloque sur cette ligne:

InputStream in = urlConnection.getInputStream();

C'est l'erreur sortie:

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)
Author: Zoe, 2019-05-23

11 answers

Résolu: Tout ce que je devais faire était de désinstaller l'application de l'émulateur ou de l'appareil connecté physique et de l'exécuter à nouveau.

 524
Author: Aaron Villalobos, 2020-10-04 11:28:11

Désinstallez simplement l'application de l'émulateur puis exécutez à nouveau et cela fonctionnera j'ai eu le même problème

Pour désinstaller l'application exécutez votre projet lors de "l'application a cessé de" message apparaît, cliquez sur "informations sur l'application", puis désinstaller

 50
Author: John Alexander, 2019-11-10 20:04:17

Tout d'abord, vous devez changer votre manifeste Android .XML Mais après cette action, vous devez désinstaller l'application et l'exécuter à nouveau. https://developer.android.com/training/basics/network-ops/connecting

Et code ici:

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

Dans AndroidManifest.xml

 36
Author: Archil Labadze, 2019-09-02 19:36:24

J'ai dû désinstaller l'application de l'émulateur, puis tout a commencé à fonctionner. J'avais juste besoin de l'autorisation suivante sur l'AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
 15
Author: Juan Cabello, 2019-11-07 13:21:17
  1. Ajouter l'autorisation ACCESS_NETWORK_STATE dans le manifeste
  2. Émulateur de réinstallation
 10
Author: AK IJ, 2019-12-03 12:05:09

Si vous avez oublié d'ajouter <uses-permission android:name="android.permission.INTERNET" /> à votre Manifeste.xml, faites-le maintenant

Si vous l'avez déjà ajouté mais que l'erreur persiste, désinstallez d'abord l'application, puis exécutez i à nouveau.
Le plus souvent je rencontre le même problème parce que j'ai oublié <uses-permission android:name="android.permission.INTERNET" /> dans ma première installation.
Le système d'exploitation pensait que l'application n'avait pas besoin d'une autorisation Internet (ce qui est stupide IMO) et ne vérifierait aucune mise à jour de l'autorisation de l'application (ce qui est même plus stupide IMO).

La seule façon de dire au système d'exploitation Android de vérifier votre mise à jour les demandes d'autorisation consiste à désinstaller l'application avant de l'installer à nouveau.

Je ne pense ni

  • <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • ni android:usesCleartextTraffic="true" vraiment important ici
 6
Author: ericn, 2021-01-05 16:52:36

Définissez android:usesCleartextTraffic="true" dans le fichier manifeste. Ajoutez l'autorisation INTERNET. Désinstaller puis installer à nouveau.

 5
Author: Ssenyonjo, 2020-05-01 23:02:30

J'ai eu le même problème dans l'émulateur Android, même après avoir ajouté

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

Et

android:usesCleartextTraffic="true"

Et la réinstallation de l'application avait toujours le problème sur mon émulateur.

Gestionnaire AVD - > Clic droit - > Démarrage à froid maintenant

Résolu mon problème, on dirait que si nous avons exécuté l'application initialement sans ajouter d'autorisations Internet / clearTextTraffic, nous pourrions avoir besoin de démarrer à froid car il stocke du cache.

 4
Author: Mazhar Ghulam, 2020-12-17 13:45:37

Définir android:usesCleartextTraffic="true" dans le fichier manifeste. Ajoutez l'autorisation INTERNET. Désinstaller puis installer à nouveau.son travail pour moi

 3
Author: Kavindu Dissanayake, 2020-11-28 18:56:20

Si quelqu'un a encore ce problème, je l'ai rencontré lorsque j'ai utilisé VPN et essayé de me connecter au wifi alors que le cellulaire était allumé. J'utilisais le client VPN Anyconnect. La solution consiste à activer le contournement autorisé qui vous permettra de lier un socket à un réseau spécifique si c'est ce que vous recherchez.

AnyConnect n'utilise allowBypass que s'il est configuré dans ses restrictions gérées (par EMM), via cette clé: vpn_connection_allow_bypass.

 0
Author: ovidiur, 2019-11-27 15:50:03

J'ai dû supprimer ce

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

Et gardez ceci

android:usesCleartextTraffic="true"
<uses-permission android:name="android.permission.INTERNET" />
 0
Author: khoane, 2020-10-20 07:29:20