java.net.SocketException: falha no soquete: EPERM (operação não permitida)

143

Estou trabalhando em um projeto do Android Studio com várias atividades. Atualmente, estou tentando ler a saída de um Java Servlet no localhost, mas parece estar travando devido a uma permissão de soquete.

Eu fiz um novo projeto, usei exatamente o mesmo código e funcionou perfeitamente. Então eu não entendo por que não está disposto a trabalhar no meu projeto.

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 ele leia os dados, mas trava nessa linha:

InputStream in = urlConnection.getInputStream();

Esta é a saída de erro:

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
fonte

Respostas:

392

Resolvido: tudo o que eu precisava fazer era desinstalar o aplicativo do emulador e executá-lo novamente.

Aaron Villalobos
fonte
8
funcionou para mim também, já descobriu por que estava acontecendo em primeiro lugar?
Vikas Pandey
9
No meu caso, tive que fornecer permissão ACCESS_NETWORK_STATE. Adicione <permissão de uso android: name = "android.permission.ACCESS_NETWORK_STATE" /> ao manifesto. E desinstalar também
sk md
3
O mesmo aqui. É estranho que a questão seja tão jovem. Talvez isso seja um bug.
User1511417
1
O aplicativo removido de um emulador e a instalação novamente resolveram meu problema, obrigado. Parece que a base de dados armazena em cache algo no sistema de arquivos e o reutiliza, suponho que dados claros do aplicativo também resolvam um problema.
Onregs 12/09/19
1
talvez a permissão já esteja em cache e arruiná-la várias vezes não esteja atualizando a permissão e, em vez de atualizar apenas os arquivos src. a reinstalação ajudou.
Atif AbbAsi 9/10/19
38

basta desinstalar o aplicativo do emulador, em seguida, execute novamente e ele funcionará. Eu tive o mesmo problema

para desinstalar o aplicativo, execute seu projeto quando a mensagem "o aplicativo parou" aparecer, clique em "informações do aplicativo" e desinstale

John Alexander
fonte
1
Não sei como, mas isso funciona. Publicação em dezembro de 2019. Embora isso funcione, curioso para saber o porquê.
Rajkiran 08/12/19
30

Antes de tudo, você precisa alterar o manifesto do Android .xml Mas, após essa ação, você deve desinstalar o aplicativo e executá-lo novamente. https://developer.android.com/training/basics/network-ops/connecting

e codifique aqui:

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

no AndroidManifest.xml

Archil Labadze
fonte
2
É verdade que, se isso já estiver definido e ainda ocorrer o mesmo erro - faça o sugerido acima - exclua o aplicativo no dispositivo e instale-o novamente.
Vladislav Varslavans 19/04
11

Eu tive que desinstalar o aplicativo do emulador e tudo começou a funcionar. Eu só precisava da permissão a seguir no AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
Juan Cabello
fonte
9
  1. Adicione a permissão ACCESS_NETWORK_STATE no manifesto
  2. Emulador de reinstalação
Habib Adnan
fonte
2

Definido android:usesCleartextTraffic="true"no arquivo de manifesto. Adicione a permissão INTERNET. Desinstale o aplicativo e instale novamente.

Ssenyonjo
fonte
0

Se alguém ainda tiver esse problema, eu o encontrei quando usei a VPN e tentei me conectar ao wifi enquanto o celular estava ligado. Eu estava usando o cliente VPN Anyconnect. A solução é ativar o desvio de permissão que permitirá vincular um soquete a uma rede específica, se é isso que você está procurando.

O AnyConnect usa apenas allowBypass se estiver configurado em suas restrições gerenciadas (pelo EMM), através desta chave: vpn_connection_allow_bypass.

ovidiur
fonte