Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
DEV CORNER<br />
Google Drive nutzen<br />
samte Netzwerkverkehr in AsyncTasks ausgeführt<br />
– jede Aktion gegen Google Drive besitzt<br />
ihren eigenen speziellen AsyncTask.<br />
Damit diese so schlank wie möglich bleiben,<br />
wird mit MyAsyncTask eine Klasse eingeführt,<br />
die sich um den ProgressDialog während<br />
der Wartezeit kümmert. Gleichzeitig<br />
bietet diese Klasse den Activities das Abmelden<br />
<strong>und</strong> wieder Anmelden während des OrientationChange.<br />
Aufgerufen wird das Laden der Benutzerdaten<br />
durch die Befehlsfolge aus Listing 6. In<br />
diesem Aufruf wird eine TaskId, der Activity-<br />
Context (this) sowie der MyAsyncTaskCompletedListener<br />
übermittelt (ebenfalls this).<br />
Der Listener in der Activity empfängt nach<br />
dem Laden der Daten das Ergebnis <strong>und</strong> einen<br />
eventuellen Fehlercode. Eine solche typische<br />
Aktion reduziert sich durch die generische<br />
MyAsyncTask-Klasse auf das in Listing 7 gezeigte<br />
Gerüst.<br />
Hier sind gleich einige Besonderheiten zu<br />
erkennen. Eventuelle Fehler in der Schnittstelle<br />
können bequem mithilfe der Exception<br />
ausgelesen werden. Diese Fehler lassen sich<br />
auf genau drei Fehlercodes reduzieren. 401<br />
bedeutet, dass der Token abgelaufen ist. Weitere<br />
errorCodes zeigen das Überschreiten des<br />
Quota, dem Limit der pro Tag erlaubten Requests<br />
an. Diese errorCodes werden zusammen<br />
mit dem Ergebnis des Aufrufs von My-<br />
AsyncTask per Listener an die zuständige Activity<br />
weitergeleitet.<br />
In der betreffenden Activity kann dann je<br />
nach eintreffendem AsyncTask auf dessen Ergebnis<br />
reagiert werden. Im Falle der Benutzerdaten<br />
werden diese für die Laufzeit der<br />
App gespeichert. Der Name des Benutzers<br />
<strong>und</strong> dessen E-Mail-Adresse werden in der<br />
Activity angezeigt. Anschließend werden die<br />
Wurzel-Verzeichnisse in einem weiteren<br />
Thread von Google Drive gelesen. Das Wort<br />
LISTING 3: Auslesen der Google Accounts<br />
// AccountManager <strong>und</strong> Liste aller Accounts holen<br />
AccountManager accountManager = new GoogleAccountManager(this);<br />
Account[] accounts = accountManager.getAccounts();<br />
LISTING 4: Zugangstoken<br />
accountManager.getAccountManager().getAuthToken(account,<br />
MyConstants.AUTHTOKENSCOPE_DRIVE, null,<br />
this, new AccountManagerCallback() {<br />
speichern<br />
root ist dabei ein Alias für die Id des Wurzelverzeichnisses.<br />
Suchen <strong>und</strong> filtern<br />
Das Auslesen von Verzeichnisinhalten gestaltet<br />
sich etwas umständlich, ist aber der Website<br />
von Google Drive geschuldet. Es ist nicht<br />
möglich, in einem Rutsch den gesamten Inhalt<br />
eines größeren Verzeichnis zu ermitteln.<br />
Stattdessen muss seitenweise geblättert werden.<br />
Der Wert der durch Google Drive zu lie-<br />
@Override<br />
public void run(AccountManagerFuture future) {<br />
try {<br />
// Diesen Token in den Preferences<br />
MyApplication.setAuthToken(future.getResult().getString(<br />
AccountManager.KEY_<br />
AUTHTOKEN));<br />
{<br />
}<br />
}, null);<br />
// Zur Weiterverarbeitung<br />
processTokenReceived();<br />
} catch (OperationCanceledException exception)<br />
} catch (AuthenticatorException exception) {<br />
} catch (Exception exception) {<br />
}<br />
GOOGLE PLAY SERVICES<br />
Ende September 2012 hat Google die Google Play Services eingeführt.<br />
Hierbei handelt es sich um eine kleine Library, die Entwickler<br />
ihren Apps beilegen müssen. Weiterhin handelt es sich um eine<br />
Service-Komponente, die Bestandteil der aktuellen Google Play<br />
Store App ist.<br />
Dieser neue Service erlaubt mithilfe einiger bequemer Methoden,<br />
aus einer App heraus die Auswahl des Google Accounts <strong>und</strong> die<br />
Beschaffung eines Tokens für die Kommunikation mit den Google<br />
Diensten. Dabei werden für die Kommunikation mit dem Benutzer<br />
standardisierte Dialoge verwendet <strong>und</strong> nicht mehr Eigenkreationen<br />
jedes Entwicklers benötigt.<br />
Dieser Schritt ist richtig <strong>und</strong> wichtig – besitzt aber einen gravierenden<br />
Nachteil. Die Nutzung dieser neuen Klassen <strong>und</strong> Methoden ist<br />
von der Existenz der Google Play Store App auf dem Gerät des Benutzers<br />
<strong>und</strong> – erschwerend – einer aktuellen Version dieser App abhängig.<br />
Diese Voraussetzung ist gerade im <strong>Android</strong>-Umfeld nicht<br />
praktikabel <strong>und</strong> zeigt einmal mehr, wie isoliert von der <strong>Android</strong>-<br />
Realität die Google-Entwickler manchmal agieren. Ein solches zentrales<br />
Feature gehört stattdessen in ein Paket ähnlich dem statischen<br />
Support-Package, welches <strong>Android</strong> 3.0/ <strong>Android</strong> 4.0 Features<br />
auch alten <strong>Android</strong>-Geräten beibringt.<br />
Der Entwickler kann diese Prüfungen (App, App-Version) zwar mit<br />
beigefügten API-Aufrufen vornehmen <strong>und</strong> dem Benutzer die Installation<br />
bzw. die Aktualisierung der App anraten. Ob der Nutzer das<br />
dann macht, steht auf einem anderen Blatt. Lehnt der Benutzer die<br />
Prüfung aus welchen Gründen auch immer ab, oder sollte das genutzte<br />
Gerät kein Google-Zertifikat besitzen (Stichwort Noname-<br />
China-Tablet), so muss die App des Entwicklers auf herkömmliche<br />
Art mit Google kommunizieren – <strong>und</strong> genau diese Herangehensweise<br />
zeigen wir in diesem Beitrag.<br />
ANDROID-USER.DE JANUAR 2013 111