NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Android - získání dat z webové stránky

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jan Lupčík
Tvůrce
Avatar
Jan Lupčík:17.11.2015 12:29

Zdravím všechny,
vrhl jsem se na tvorbu Android aplikací. Učil jsem se však z trochu starších zdrojů a takové praktiky se už nepoužívají. Na takový problém jsem narazil, když jsem potřeboval získat data z webové stránky.
Na internetu jsem si našel tohle: http://stackoverflow.com/…is-deprecate
To by bylo suprový, ale Android Studio hlásí, že nemůže najít io. Když si to pak chci převést přes toString(), aplikace v telefonu ihned po spuštění spadne.

Nemá tady tedy někdo zkušenosti se získáváním dat z webové stránky?
Budu vděčný za každou radu. :)

Odpovědět
17.11.2015 12:29
TruckersMP vývojář
Avatar
Atrament
Člen IT Redactor Gang
Avatar
Atrament:18.11.2015 1:18

Android Studio hlásí, že nemůže najít io

No a přidal sis do projektu tu knihovnu apache commons-io jak píšou na tom stackoverflow?

 
Nahoru Odpovědět
18.11.2015 1:18
Avatar
mara
Člen
Avatar
Odpovídá na Jan Lupčík
mara:18.11.2015 23:11

pro android by měla fungovat knihovna stejně jako pro normální javu jsoup, která je na tyto věci suprová. Určitě se na ni podívej. Nezapomněl jsi povolit v manifestu internet ? Pokud jsi ho nepovolil, tak je to tím.

Nahoru Odpovědět
18.11.2015 23:11
Co na srdci, to na Facebooku
Avatar
Jan Lupčík
Tvůrce
Avatar
Jan Lupčík:19.11.2015 16:57

Atrament: přidal, ale ta hlásí další chyby. V tom celém, co jsem si stáhl, je 100 chyb.

mara: už jsem ho povolil, nic se nezměnilo.

Nahoru Odpovědět
19.11.2015 16:57
TruckersMP vývojář
Avatar
mara
Člen
Avatar
Odpovídá na Jan Lupčík
mara:19.11.2015 21:21

Pokud jsi ho neměl povolený, tak by ti to nefungovalo taky. Těch chyb tam budeš mít viditelně více. Můžeš mi teda nasdílet celý tvůj kód včetně manifestu ?

Nahoru Odpovědět
19.11.2015 21:21
Co na srdci, to na Facebooku
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na mara
Jan Lupčík:20.11.2015 18:38

Ještě jsem se o něco pokoušel, to ale také nevyšlo (od toho commons-io jsem opustil).
Takže aktuální MainActivity.java:

package ...;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends ActionBarActivity {

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

        // Získání dat ze serveru
        try {
            URL url = new URL("...");
            HttpURLConnection data = (HttpURLConnection) url.openConnection();
            InputStream in = new BufferedInputStream(data.getInputStream());

            // Zpracování dat
            BufferedReader bReader = new BufferedReader(new InputStreamReader(in, "utf-8"), 8);
            StringBuilder sBuilder = new StringBuilder();

            String line = null;
            while ((line = bReader.readLine()) != null) {
                sBuilder.append(line + "\n");
            }

            // Nahrání dat do textu
            String dataArticles = sBuilder.toString();
            TextView articles = (TextView) findViewById(R.id.articles);
            articles.setText(dataArticles);
        } catch (IOException e) {
            TextView articles = (TextView) findViewById(R.id.articles);
            articles.setText("Nastala chyba při získávání dat.");
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

AndroidManifes­t.xml:

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

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

</manifest>
Editováno 20.11.2015 18:39
Nahoru Odpovědět
20.11.2015 18:38
TruckersMP vývojář
Avatar
mara
Člen
Avatar
Odpovídá na Jan Lupčík
mara:20.11.2015 19:00

A co ti to hodí za chybu ? Nebo co to dělá ?

Nahoru Odpovědět
20.11.2015 19:00
Co na srdci, to na Facebooku
Avatar
mara
Člen
Avatar
Odpovídá na Jan Lupčík
mara:20.11.2015 19:03
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="..." >

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>


</manifest>

zkus tady tohle... vždycky jsem uses permission dával před application, ale nevím, jestli je to ta chyba, kvůli které to nefunguje.

Nahoru Odpovědět
20.11.2015 19:03
Co na srdci, to na Facebooku
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na mara
Jan Lupčík:20.11.2015 19:06

Aplikace hned po spuštění napíše "Aplikace přestala pracovat" a spadne to.

Nahoru Odpovědět
20.11.2015 19:06
TruckersMP vývojář
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na mara
Jan Lupčík:20.11.2015 19:10

Stejný výsledek. :(

Nahoru Odpovědět
20.11.2015 19:10
TruckersMP vývojář
Avatar
mara
Člen
Avatar
Odpovídá na Jan Lupčík
mara:20.11.2015 22:54

Potřebuješ pracovat s HttpURLConnection knihovnou ? Nechceš zkusit jsoup ? Tady s tímto ti moc neporadím. Vždycky, když pracuji s webem, tak to dělám přes jsoup.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
20.11.2015 22:54
Co na srdci, to na Facebooku
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na mara
Jan Lupčík:21.11.2015 10:58

Mně je jedno, co použiji, hlavně aby to fungovalo. :D

Nahoru Odpovědět
21.11.2015 10:58
TruckersMP vývojář
Avatar
Jan Lupčík
Tvůrce
Avatar
Jan Lupčík:21.11.2015 12:46

Momentálně mám tento kód (zkouším teda ten jsoup, tamto jsem vzdal):

package ...;

import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.IOException;

public class MainActivity extends ActionBarActivity {

    String url = "...";
    ProgressDialog mProgressDialog;

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

        Button articlesButton = (Button) findViewById(R.id.articlesButton);

        // Nastavení akce pro tlačítko
        articlesButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                // Získání dat
                new Title().execute();
            }
        });
    }

    // Titulek stránky
    private class Title extends AsyncTask<Void, Void, Void> {
        String title;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mProgressDialog = new ProgressDialog(MainActivity.this);
            mProgressDialog.setTitle(R.string.app_name);
            mProgressDialog.setMessage("Načítání...");
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            try {
                // Připojení se ke stránce
                Document document = Jsoup.connect(url).get();
                // Získá titulek stránky
                title = document.title();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            TextView articles = (TextView) findViewById(R.id.articles);
            articles.setText(title);
            mProgressDialog.dismiss();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Mám i stáhnutý jsoup a je ve složce libs. Načítání dat ale stejně nefunguje - ať se pokouším o popis stránky či titulek, nic to nevrací. Pokud ale proměnnou title naplním textem "Hello world", text se vypíše.
To je hrozný to získávání dat z webu. :D

Editováno 21.11.2015 12:46
Nahoru Odpovědět
21.11.2015 12:46
TruckersMP vývojář
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Jan Lupčík
Jan Lupčík:21.11.2015 17:41

Aha, mně zrovna nešel internet. Tak už to konečně funguje. Díky za pomoc. :)

Nahoru Odpovědět
21.11.2015 17:41
TruckersMP vývojář
Avatar
mara
Člen
Avatar
Odpovídá na Jan Lupčík
mara:21.11.2015 23:32

Aha :D Tak to bude ono :D Jinak jestli se chceš tomu věnovat, tak bych doporučil dělat v tom jsoup, jak jsi to udělal teď naposledy. Je to hodně propracovaná knihovna a je podle mě o dost lepší než ta, co jsi tam měl předtím.

Editováno 21.11.2015 23:35
Nahoru Odpovědět
21.11.2015 23:32
Co na srdci, to na Facebooku
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.