Avatar
IT Man
Redaktor
Avatar
IT Man:

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
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
Atrament
Člen
Avatar
Atrament:

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 IT Man
mara:

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
IT Man
Redaktor
Avatar
IT Man:

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
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
mara
Člen
Avatar
Odpovídá na IT Man
mara:

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
IT Man
Redaktor
Avatar
Odpovídá na mara
IT Man:

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
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
mara
Člen
Avatar
Odpovídá na IT Man
mara:

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 IT Man
mara:
<?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
IT Man
Redaktor
Avatar
Odpovídá na mara
IT Man:

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

Nahoru Odpovědět 20.11.2015 19:06
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
IT Man
Redaktor
Avatar
Odpovídá na mara
IT Man:

Stejný výsledek. :(

Nahoru Odpovědět 20.11.2015 19:10
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
mara
Člen
Avatar
Odpovídá na IT Man
mara:

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í
+1 bodů
Řešení problému
Nahoru Odpovědět 20.11.2015 22:54
Co na srdci, to na Facebooku
Avatar
IT Man
Redaktor
Avatar
Odpovídá na mara
IT Man:

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

Nahoru Odpovědět 21.11.2015 10:58
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
IT Man
Redaktor
Avatar
IT Man:

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
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
IT Man
Redaktor
Avatar
Odpovídá na IT Man
IT Man:

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
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
mara
Člen
Avatar
Odpovídá na IT Man
mara:

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  +1 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.