Web-Abfragen mit Android
Vorbereitung des Gerätes
Falls ein Emulator (beispielsweise »…\android-sdk-windows\tools\emulator-arm.exe«) verwendet wird, so ist dieser nötigenfalls in der Firewall des umgebenden Systems freizugeben.
In jedem Falls sollte zunächst erst einmal überprüft werden, ob das Gerät überhaupt Internet-Zugang hat.
Festlegen der nötigen Berechtigungen
Die Berechtigungen zum Zugriff auf das Internet ist in der Datei »ApplicationManifest.xml« einzutragen. Dies wird bei neueren Android -Versionen aber wohl nicht mehr benötigt
- in »ApplicationManifest.xml«
<uses-permission android:name="android.permission.INTERNET"/>
- URI
http://developer.android.com/reference/android/Manifest.permission.html
Festlegen der nötigen Berechtigungen
Für Web-Zugriffe können die normalen Java-SE -Klassen verwendet werden.
Wohl ab API-Level 11 dürfen Web-Abfragen wohl nicht mehr auf dem UI-Thread stattfinden. Daher erzeugen wir unten mit »new Task().execute« einen neuen Verlauf (englisch “thread ”) und starten diesen. Nach dem Start des Verlaufs, wird von diesem die Methode »doInBackground« mit den Argumenten von »execute« aufgerufen.
»doInBackground« läuft dann nicht auf dem UI-Thread.
»onPostExecute« läuft jedoch auf dem UI-Thread und kann so Informationen ausgeben.
(Zwei weitere Verben, die wir hier nicht verwenden sind »onPreExecute« zum Vorbereiten einer Ausgabe auf dem UI-Thread und »onProgressUpdate« zum Aktualisieren einer Ausgabe auf dem UI-Thread.)
In der Implementation von »doInBackground« lesen wir eine Webseite bei der als Argument übergebenen URI ein und geben diese als Zeichenfolge zurück. Dies erfolgt in »onPostExecute«, welches das Ergebnis von »doInBackground« als Argument erhält.
MainActivity.java
package com.example;
public class MainActivity extends android.app.Activity
{class Task extends android.os.AsyncTask
< java.lang.String, java.lang.Integer, java.lang.String >
{protected java.lang.String doInBackground
( final java.lang.String ... varargs ){ try
{ final java.lang.StringBuilder builder
= new java.lang.StringBuilder();
java.net.URL url = new java.net.URL( varargs[ 0 ]);
final java.net.HttpURLConnection connection =
( java.net.HttpURLConnection )url.openConnection();
connection.setConnectTimeout( 8000 );
connection.setReadTimeout( 8000 );
final java.io.InputStream stream = connection.getInputStream();
final int code = connection.getResponseCode(); if
( code == java.net.HttpURLConnection.HTTP_OK )
{ final java.io.BufferedReader input
= new java.io.BufferedReader
( new java.io.InputStreamReader( stream ), 8192 );
java.lang.String line;
while(( line = input.readLine() )!= null )
builder.append( line );
input.close(); }
return builder.toString(); }catch( final java.lang.Exception exception )
{ return java.lang.String.valueOf( exception ); }}protected void onPostExecute( final java.lang.String result )
{ android.util.Log.i( result ); }}
public void onCreate( final android.os.Bundle bundle )
{ super.onCreate( bundle );
new Task().execute( "http://www.example.com/" ); }}- Ausgabe ohne Internet-Verbindung:
java.net.SocketTimeoutException: failed to connect to www.example.com/93.184.216.119 (port 80) after 8000ms
- Ausgabe mit Internet-Verbindung (auf die Debug-Konsole):
- <!doctype html><html><head> <title>Example Domain…
Senden vor Formulardaten
Das folgende Fragement zeigt, wie unter Java SE Formulardaten verschickt werden können. Dieselbe Vorgehensweise kann auch unter Android eingesetzt werden.
- Posten von Formulardaten (ungetestet, für Java SE )
class Main
{ public static void main( final java.lang.String[] args ) throws Exception
{ java.net.URL url = new java.net.URL( "http://www.example.com/post.php" );
java.util.Map< java.lang.String, java.lang.Object >map = new LinkedHashMap<>();
map.put( "name", "James" );
map.put( "email", "james@example.com" );
java.lang.StringBuilder builder = new java.lang.StringBuilder();
for( java.util.Map.Entry< java.lang.String, java.lang.Object >entry : map.entrySet() )
{ if( builder.length() > 0 )builder.append( '&' );
builder.append( java.net.URLEncoder.encode( param.getKey(), "UTF-8" ));
builder.append('=');
builder.append( URLEncoder.encode( String.valueOf( param.getValue() ), "UTF-8" )); }
final byte[] bytes = builder.toString().getBytes( "UTF-8" );
final HttpURLConnection connection =( java.net.HttpURLConnection )url.openConnection();
connection.setRequestMethod( "POST" );
connection.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded" );
connection.setRequestProperty( "Content-Length", java.lang.String.valueOf( bytes.length ));
connection.setDoOutput( true );
connection.getOutputStream().write( bytes );
final java.io.Reader reader = new BufferedReader
( new java.io.InputStreamReader( connection.getInputStream(), "UTF-8" ));
for( int ch;( ch = in.read() )>= 0; java.lang.System.out.print(( char )ch )); }}
Übungsaufgaben
/ Übungsaufgabe
Überarbeiten Sie das erste Programm so, daß die Ausgabe nicht auf der Debug-Konsole, sondern auf dem Bildschirm des Android-Gerätes erscheint.
/ Übungsaufgabe *
Überarbeiten Sie das Programm »MainActivity.java« so, daß es eine Formulareingabe an einen Web-Dienst sendet, und die erhaltene Antwort ausgibt.