2010-07-29

Zugriff auf Google Accounts im Emulator

Wenn man Android-Entwickler fragt, ob man aus dem Emulator heraus auf Google-Konten zugreifen kann, erntet man in den meisten Fällen ein Nein. Schon seit Android 2.0 gibt es in den Einstellungen den Bereich Accounts & sync. Der sieht so aus:
Screenshot: Accounts & sync settings
Accounts & sync settings
Tippt man auf Add account, landet man hier:
Screenshot: Add an Exchange account
Add an Exchange account
Also kein Google Account. Dieses Verhalten ist selbst beim derzeit aktuellen 2.2-Image so. ABER – und hiermit bekenne ich meine diesbezügliche Ignoranz :-) - setzt man ein ADV (Android Virtual Device) auf Basis der Google APIs auf, sieht die Sache gleich anders aus. …nämlich so…:
Screenshot: Add an account 
Add an account
Klickt man auf Google, kann man in einem Wizard ein neues Konto anlegen oder aber ein bereits vorhandenes nutzen. Die Seite Accounts & sync settings sieht dann so aus:
Screenshot: Accounts & sync settings
Accounts & sync settings
Leider – und jetzt kommt ein nicht unerheblicher Haken – scheint Sync is OFF allzu wörtlich gemeint zu sein, soll bedeuten wirklich synchronisieren konnte ich ein solches Konto nicht. Falls Sie wissen, wie man das aktivieren kann, so hinterlassen Sie doch bitte einen entsprechenden Kommentar.
Vielleicht fragen Sie sich nun, was der ganze Aufwand soll, wenn man letztlich doch nicht synchronisieren kann. Hilfreich ist es, weil man so zumindest den Zugriff auf den seit Eclair vorhandenen AccountManager testen kann.

AccountManager am = AccountManager.get(this);
Account[] accounts = am.getAccounts();
   
for (Account account : accounts) {
  Log.d("", account.toString());
}
Java2html

Wie man letztlich auf ein Konto zugreift, zeige ich in einem der folgenden Einträge.

2010-07-14

Schnüffeln erlaubt – eingehende Anrufe

Mitzubekommen wenn oder wann das Telefon klingelt, ist nicht nur für den Nutzer (meistens) erstrebenswert – auch aus Sicht der Software kann es sich lohnen, sozusagen an der Leitung zu lauschen. Wie das unter Android funktioniert, zeigt dieser Eintrag.

Um die folgenden Quelltextfragmente ausprobieren zu können, müssen Sie sie nur in eine rudimentäre Activity packen. Den Anfang machen zwei Variablendeklarationen:

private PhoneStateListener listener;
private TelephonyManager m;
Java2html

Der TelephonyManager gestattet den Zugriff auf zahlreiche Telefonie-bezogenen Funktionen. Eine Instanz dieses Dienstes erhält man so:

m = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
Java2html

Um auf eingehende Anrufe reagieren zu können, ist nur eine Zeile Code nötig:

m.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
Java2html

Schließlich noch der eigentliche Listener:

listener = new PhoneStateListener() {

  @Override
  public void onCallStateChanged(int state, String incomingNumber) {
    if (TelephonyManager.CALL_STATE_RINGING == state) {
      Log.d(getClass().getName(), incomingNumber);
    }
  }
};
Java2html

Android-typisch lässt sich also mit sehr wenig Quelltext die Telefonnummer von eingehenden Anrufen auslesen. Ebenfalls Android-typisch muss die Anwendung das entsprechende Recht allerdings anfordern. Das sieht dann so aus:

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

Nun möchte ich Ihnen noch zeigen, wie Sie mit dem Emulator ein eingehendes Gespräch simulieren. Hierzu ist eine telnet-Verbindung zum Emulator herzustellen und dann das Kommando gsm call abzusetzen.

telnet-Verbindung zum Emulator 
telnet-Verbindung zum Emulator

Und so sieht der eigehende Anruf dann aus:

Ein simulierter eingehender Anruf 
Ein simulierter eingehender Anruf

Was kann man mit so einer Funktionalität alles realisieren? Statistiken ein- und ausgehender Anrufe, Anrufhäufigkeiten… Haben Sie eine Idee? Schreiben Sie mir.

2010-07-09

TKWeek 1.1.9

Screenshot von TKWeek 1.1.9
Screenshot von TKWeek 1.1.9

TKWeek 1.1.9 kennt so genannte fixe Ereignisse. Damit lassen sich auch solche Ereignisse speichern, die sich nicht jährlich wiederholen.

2010-07-06

Nah oder fern - Spaß mit Sensoren

In diesem Beitrag möchte ich mich mit einem der Sensoren von Android-Geräten beschäftigen. Wenn Sie sich beispielsweise ein Nexus One ans Ohr halten, wird dessen Display ausgeschaltet. Sobald Sie das Telefon vom Ohr entfernen, aktiviert es sich wieder. Gesteuert wird dies mittels eines (An)näherungssensors (proximity sensor). Dieser lässt sich sehr bequem in eigenen Programmen nutzen. Beachten Sie aber bitte, dass solche Sensoren nicht in jedem Androiden vorhanden sind. Auch der Emulator kennt ihn derzeit nicht.

private SensorManager manager;
private SensorEventListener listener;
private Sensor sensor;
Java2html

manager = (SensorManager) getSystemService(SENSOR_SERVICE);
Java2html

sensor = null;
List<Sensor> sensors = manager.getSensorList(Sensor.TYPE_PROXIMITY);
if (sensors.size() > 0) {
    sensor = sensors.get(0);
    manager.registerListener(listener, sensor,
    SensorManager.SENSOR_DELAY_NORMAL);
}
Java2html

In einem ersten Schritt besorgen wir uns also eine Instanz der Klasse SensorManager . Sie gibt unter anderem Auskunft darüber, welche Sensoren vorhanden sind.  Falls ein proximity sensor zur Verfügung steht, registrieren wir einen SensorEventListener. Eine Trivialimplementierung sieht so aus:

    listener = new SensorEventListener() {

      @Override
      public void onSensorChanged(SensorEvent event) {
        if (event.values.length > 0) {
          float current = event.values[0];
          float maxRange = event.sensor.getMaximumRange();
          boolean far = (current == maxRange);
          Log.d("", Boolean.toString(far));
        }
      }

      @Override
      public void onAccuracyChanged(Sensor sensor, int accuracy) {
      }
    };
Java2html

Falls Sie die merkwürdig anmutende Zuweisung an die Variable far irritiert: die Dokumentation rät zu diesem Vorgehen, wenn Sensoren keine richtigen Längenangaben liefern. Und ein letzter Tipp: wenn Sie das Ganze in eine Activity packen, denken Sie bitte daran, die Methode onDestroy zu überschreiben und dort den Listener zu entfernen.