Download Web-Content, AsyncTask

Tintenfisch

Bekanntes Mitglied
Hey, folgender Fehler erscheint beim Versuch Inhalte aus dem Internet zu laden. Den Code habe ich wie hier geschrieben verwendet und die Internet-Permission ist gesetzt. Das Programm startet soweit auch, nur fliegt in der doInBackground Methode die Exception. Hat wer von euch noch ne Idee woran das liegen könnte?

[CODE lang="java" title="MainActivity"]package com.example.downloadwebcontent2;

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);


DownloadTask task = new DownloadTask();
String result = null;
try {
//sending utl to class method doInBackground()
result = task.execute("https://www.google.de").get();
}
catch(Exception e)
{
e.printStackTrace();
}
Log.i("Result",result);

}

//type of vatiable which we will send to class
public class DownloadTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
String result="";
URL url;
HttpURLConnection urlConnection = null;
try
{
url=new URL(urls[0]);
urlConnection=(HttpURLConnection) url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
int data = reader.read();
while(data!=-1)
{
char current=(char) data;
result+=current;
data=reader.read();
}
return result;
}
catch(Exception e)
{
e.printStackTrace();
return "Failed";
}
}
}
}[/CODE]

XML:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.downloadwebcontent2">


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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.DownloadWebContent2">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

W/System.err: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
W/System.err: at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:150)
W/System.err: at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
at java.net.InetAddress.getAllByName(InetAddress.java:1152)
at com.android.okhttp.Dns$1.lookup(Dns.java:41)
W/System.err: at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:178)
at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:144)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:86)
at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:176)
at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
W/System.err: 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)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:248)
at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:211)
at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:30)
W/System.err: at com.example.downloadwebcontent2.MainActivity$DownloadTask.doInBackground(MainActivity.java:50)
at com.example.downloadwebcontent2.MainActivity$DownloadTask.doInBackground(MainActivity.java:40)
W/System.err: at android.os.AsyncTask$3.call(AsyncTask.java:394)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
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:923)
W/System.err: Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
W/System.err: at libcore.io.Linux.android_getaddrinfo(Native Method)
at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:73)
at libcore.io.BlockGuardOs.android_getaddrinfo(BlockGuardOs.java:202)
at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:73)
W/System.err: at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:135)
... 24 more
W/System.err: Caused by: android.system.ErrnoException: android_getaddrinfo failed: EPERM (Operation not permitted)
W/System.err: ... 29 more
 
premission != permission 🙂
nein an der Permissioin liegt es nicht die ist OK



Java:
result = task.execute("https://www.google.de").get();
erstens. du willst von eine SSL Seite lesen aber benutzt nur die normale HttpURLConnection ohne „s“ benutze HttpsURLConnection



zweitens. schickst du den Request auch nicht ab also kann auch nichts im Stream ankommen. urlConnection.connect(); fehlt vor dem Stream.
Dann wird auch der default Get Request abgeschikt.

Java:
        protected String doInBackground(String... urls) {
            String result = "";
            URL url;
            HttpsURLConnection urlConnection = null;
            try {
                url = new URL(urls[0]);
                urlConnection = (HttpsURLConnection) url.openConnection();
                //urlConnection.setRequestMethod("GET");
                urlConnection.connect();

                InputStream in = urlConnection.getInputStream();
                InputStreamReader reader = new InputStreamReader(in);
                int data = reader.read();
                while (data != -1) {
                    char current = (char) data;
                    .......
 
nein an der Permissioin liegt es nicht die ist OK
Wie kommst Du darauf, dass die Rechte in Ordnung sind, wenn der TE da einen Tippfehler hat?

erstens. du willst von eine SSL Seite lesen aber benutzt nur die normale HttpURLConnection ohne „s“ benutze HttpsURLConnection
Das ist doch komplett egal. HttpsURLConnection ist von HttpURLConnection abgeleitet. URL wird eine entsprechend korrekte Instanz erzeugen. Dein Code dürfte aber vermutlich eine ClassCastException werfen, wenn kein https URL angegeben wurde.

Der connect Aufruf sollte aber noch hinzu gefügt werden - da hast Du dann Recht.
 

Neue Themen


Zurück
Oben