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.
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.
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 ?
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);
}
}
AndroidManifest.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>
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.
Jan Lupčík:20.11.2015 19:06
Aplikace hned po spuštění napíše "Aplikace přestala pracovat" a spadne to.
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.
+20 Zkušeností
+2,50 Kč
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.
Jan Lupčík:21.11.2015 17:41
Aha, mně zrovna nešel internet. Tak už to konečně funguje. Díky za pomoc.
mara:21.11.2015 23:32
Aha Tak to bude ono 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.
Zobrazeno 15 zpráv z 15.