Ich arbeite an einem Android Studio-Projekt mit mehreren Aktivitäten. Ich versuche derzeit, die Ausgabe eines Java-Servlets auf localhost zu lesen, aber es scheint aufgrund einer Socket-Berechtigung abzustürzen.
Ich habe ein neues Projekt erstellt, genau den gleichen Code verwendet und perfekt funktioniert. Ich verstehe also nicht, warum ich nicht bereit bin, an meinem Projekt zu arbeiten.
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();
}
}
Ich erwarte, dass es die Daten liest, aber es stürzt in dieser Zeile ab:
InputStream in = urlConnection.getInputStream();
Dies ist die Fehlerausgabe:
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)
Deinstallieren Sie einfach die App vom Emulator und führen Sie sie erneut aus. Es wird funktionieren. Ich hatte das gleiche Problem
Um die App zu deinstallieren, führen Sie Ihr Projekt aus, wenn die Meldung "Die Anwendung wurde gestoppt" angezeigt wird. Klicken Sie auf "App-Informationen" und deinstallieren Sie dann
quelle
Zunächst müssen Sie Ihr Android-Manifest .xml ändern. Nach dieser Aktion müssen Sie die Anwendung deinstallieren und erneut ausführen. https://developer.android.com/training/basics/network-ops/connecting
und Code hier:
in AndroidManifest.xml
quelle
Ich musste die App vom Emulator deinstallieren und dann fing alles an zu funktionieren. Ich brauchte nur die folgende Berechtigung für die AndroidManifest.xml
quelle
quelle
In
android:usesCleartextTraffic="true"
der Manifestdatei festlegen. Fügen Sie die Berechtigung hinzuINTERNET
. Deinstallieren Sie die App und installieren Sie sie erneut.quelle
Wenn jemand dieses Problem immer noch hat, bin ich darauf gestoßen, als ich VPN verwendet und versucht habe, eine Verbindung zu WLAN herzustellen, während das Mobiltelefon eingeschaltet war. Ich habe den Anyconnect VPN-Client verwendet. Die Lösung besteht darin, den zulässigen Bypass zu aktivieren, mit dem Sie einen Socket an ein bestimmtes Netzwerk binden können, wenn Sie dies suchen.
AnyConnect verwendet allowBypass nur, wenn es in seinen verwalteten Einschränkungen (von EMM) über diesen Schlüssel konfiguriert ist: vpn_connection_allow_bypass.
quelle