2010-08-19

Lichtgestalten – wieder Spaß mit Sensoren

Wenn ich es sogar mit dem folgenden Screenshot schaffe, Ihre Aufmerksamkeit zu erregen, kann ich mich wirklich glücklich schätzen… :-)

Screenshot des Testprogramms für den Helligkeitssensor  
Screenshot des Testprogramms für den Helligkeitssensor

In dieser Folge der Reihe Spaß mit Sensoren zeige ich Ihnen, wie Sie den Helligkeitssensor von Androiden auslesen. Zunächst der Quelltext der Anwendung:

package com.thomaskuenneth;

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;

public class Test extends Activity {

  private TextView view;

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

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    view = (TextView) findViewById(R.id.view);

    manager = (SensorManager) getSystemService(SENSOR_SERVICE);
    listener = new SensorEventListener() {

      public void onAccuracyChanged(Sensor sensor, int accuracy) {
      }

      public void onSensorChanged(SensorEvent event) {
        if (event.values.length > 0) {
          float light = event.values[0];
          view.setText(Float.toString(light));
        }
      }

    };
   
    sensor = manager.getDefaultSensor(Sensor.TYPE_LIGHT);
    if (sensor != null) {
      manager.registerListener(listener, sensor,
          SensorManager.SENSOR_DELAY_NORMAL);
    } else {
      view.setText("keinen Helligkeitssensor gefunden");
    }
  }

  @Override
  protected void onDestroy() {
    if (sensor != null) {
      manager.unregisterListener(listener);
    }
    super.onDestroy();
  }
}
Java2html

Ein Großteil des Listings ist bereits bekannt; zunächst wird eine Referenz auf einen SensorManager besorgt und im Anschluss ein SensorEventListener registriert. Der einzige Unterschied zum letzten Beispiel besteht darin, dass ich die Methode getDefaultSensor aufrufe. Das ist einerseits praktisch, weil ich nicht wie bei getSensorList über die Liste iterieren muss. Um zu prüfen, ob ein entsprechender Sensor (im Beispiel ist dies Sensor.TYPE_LIGHT) vorhanden ist, reicht also eine Abfrage auf null. Allerdings sagt die Doku, dass es sich bei dem gelieferten Sensor um einen zusammengesetzten oder kombinierten Sensor handeln kann, dessen Daten möglicherweise gemittelt oder gefiltert wurden. Ob das in der Praxis tatsächlich Auswirkungen hat, habe ich beim Helligkeitssensor meines Nexus One nicht weiter überprüft.

Übrigens hat Wikipedia eine schöne Übersicht, die Werte auf Lichtverhältnisse abbildet. Erweitern Sie doch mein Progrämmchen und machen es zu einer hübschen Helligkeitssensor-App (sofern es die nicht schon ohnehin gibt :-)).

No comments:

Post a Comment