Erstellen der Apps mit Umgebungssensoren
German (Deutsch) translation by Władysław Łucyszyn (you can also view the original English article)
Erfahren Sie, wie Sie mit den Android-Umgebungssensoren Informationen über die Umgebung des Benutzers erfassen, einschließlich Umgebungstemperatur, Druck, Luftfeuchtigkeit und Licht.
Das Android-System unterstützt eine Reihe von Gerätesensoren, von denen einige in Hardware und andere in Software implementiert sind. Die Umgebungssensoren sind alle Hardwarefunktionen und bieten Zugriff auf Informationen zu Umgebungstemperatur, Druck, Luftfeuchtigkeit und Licht. Diese Sensoren geben folgende Werte zurück: Die Temperatur wird in Grad Celsius, der Luftdruck in hPa Millibar, die relative Luftfeuchtigkeit als Prozentwert und das Umgebungslicht in SI-Lux-Einheiten gemessen. In diesem Tutorial werden wir den grundlegenden Prozess für die Verwendung dieser vier Hauptumgebungssensoren durchgehen. Wir werden den Gerätetemperatursensor nicht verwenden, da er ab Android 4.0 veraltet ist.
Es gibt viele mögliche Anwendungen für diese Sensoren, wie Barometer und Thermometer. Möglicherweise sind Sie bereits in Google Play auf solche Apps gestoßen, es ist jedoch zu beachten, dass sie ihre Funktionen möglicherweise nicht unbedingt mithilfe von Umgebungssensoren implementieren. Beispielsweise verwenden Wetter-Apps häufig Standortdaten, die über das Web abgerufen werden, um Umgebungsinformationen basierend auf Ihrem Standort zu ermitteln.
Da diese Sensoren über die Hardware der Benutzer bereitgestellt werden, variiert die Unterstützung zwischen Geräten und Herstellern. Zum Zeitpunkt des Schreibens unterstützen nur sehr wenige Android-Smartphones oder -Tablets alle Umgebungssensoren, aber viele der neueren Modelle unterstützen einen oder mehrere von ihnen. Es ist wichtig, zu überprüfen, ob der Benutzer über bestimmte Sensoren verfügt, und zu vermeiden, dass Funktionen verwendet werden, die vollständig von diesen abhängig sind. Die einzige Ausnahme besteht darin, dass Sie sicherstellen, dass nur Benutzer mit der erforderlichen Hardware Ihre Anwendung herunterladen können. Dies können Sie mithilfe der Filter für eine App tun, die im Google Play Store aufgeführt sind.
Schritt 1: Erstellen Sie ein neues Android-Projekt
Erstellen Sie ein neues Android-Projekt in Eclipse und geben Sie ihm einen Namen Ihrer Wahl. Lassen Sie Eclipse eine Hauptaktivität erstellen, da dies die einzige Klasse ist, die wir benötigen. Für den in diesem Tutorial verwendeten Code zielen wir auf Android API Level 14 (Android 4.0 - Ice Cream Sandwich) ab. Sie können jedoch auch eine neuere Version verwenden, wenn Sie dies wünschen. Sie müssen keine Änderungen an der Manifest-Datei vornehmen. Ihre Hauptaktivitätsklasse sollte die folgende Anfangsstruktur mit dem von Ihnen gewählten Klassennamen haben:
1 |
public class EnvironmentCheckerActivity extends Activity { |
2 |
|
3 |
/** Called when the activity is first created. */
|
4 |
@Override
|
5 |
public void onCreate(Bundle savedInstanceState) { |
6 |
super.onCreate(savedInstanceState); |
7 |
setContentView(R.layout.main); |
8 |
}
|
9 |
}
|
Wir werden einige Schnittstellen implementieren. Erweitern Sie daher Ihre Eröffnungsdeklarationszeile wie folgt:
1 |
public class EnvironmentCheckerActivity extends Activity implements OnClickListener, SensorEventListener { |
Der Klick-Listener dient zur Benutzerinteraktion und der Sensor-Ereignis-Listener zum Empfangen von Daten von den Gerätesensoren. Eclipse sollte Importanweisungen für die Klassen Activity und Bundle bereitgestellt haben, Sie müssen jedoch auch Folgendes zur Liste hinzufügen:
1 |
import android.content.Context; |
2 |
import android.hardware.Sensor; |
3 |
import android.hardware.SensorEvent; |
4 |
import android.hardware.SensorEventListener; |
5 |
import android.hardware.SensorManager; |
6 |
import android.view.View; |
7 |
import android.view.View.OnClickListener; |
8 |
import android.widget.Button; |
9 |
import android.widget.TextView; |
10 |
import android.widget.Toast; |
Wir werden der Klasse später Code hinzufügen.
Schritt 2: Benutzerinteraktion entwerfen
Um den grundlegenden Prozess für die Verwendung der Umgebungssensoren zu demonstrieren, werden wir eine einfache Benutzeroberfläche erstellen. Die App zeigt eine Liste mit vier Schaltflächen an, eine für jeden der von uns verwendeten Sensoren. Wenn der Benutzer eine Schaltfläche auswählt, versucht die App, die entsprechenden Informationen abzurufen und in einer Textansicht anzuzeigen. Definieren wir zunächst einige Textzeichenfolgen, die in der Benutzeroberfläche verwendet werden. Öffnen Sie Ihre Datei "res/values/strings.xml" und bearbeiten Sie sie so, dass sie Folgendes enthält:
1 |
<resources>
|
2 |
<string name="hello">Choose from the options to check your environment</string> |
3 |
<string name="app_name">Environment Checker</string> |
4 |
<string name="ambient_label">Ambient Temperature</string> |
5 |
<string name="light_label">Light</string> |
6 |
<string name="pressure_label">Pressure</string> |
7 |
<string name="humidity_label">Relative Humidity</string> |
8 |
<string name="text_placeholder">-</string> |
9 |
</resources>
|
Diese repräsentieren den Titel, den Einführungstext, die Schaltflächenbeschriftungen und einen Platzhalter für die Textansichten. Wir werden einige zeichnbare Ressourcen für das Design verwenden, aber Sie können sie weglassen, wenn Sie möchten. Um sie zu verwenden, müssen Sie in jedem Zeichnungsordner Ihrer App zwei zusätzliche Dateien erstellen, "back.xml" und "btn.xml" (wählen Sie nacheinander jeden Zeichnungsordner aus und wählen Sie "Datei" > "Neu" > "Datei", dann geben Sie den Dateinamen ein). Geben Sie für die Datei "back.xml" den folgenden Code ein:
1 |
<shape xmlns:android="http://schemas.android.com/apk/res/android" |
2 |
android:dither="true"> |
3 |
<gradient
|
4 |
android:startColor="#FF000033" |
5 |
android:endColor="#FF000033" |
6 |
android:centerColor="#FF000066" |
7 |
android:angle="180" /> |
8 |
</shape>
|
Geben Sie für die Datei "btn.xml" Folgendes ein:
1 |
<shape xmlns:android="http://schemas.android.com/apk/res/android" |
2 |
android:dither="true"> |
3 |
<gradient
|
4 |
android:startColor="#FF00CC00" |
5 |
android:endColor="#FF66CC66" |
6 |
android:angle="90" /> |
7 |
<padding android:left="10dp" android:top="10dp" |
8 |
android:right="10dp" android:bottom="10dp" /> |
9 |
<corners android:radius="2dp" /> |
10 |
</shape>
|
Die Rückseite ist für den Aktivitätshintergrund und die "btn" -Ziehung für die Schaltflächenhintergründe vorgesehen. Sie können diese Designs jederzeit nach Belieben ändern. Kopieren Sie sie in jeden Zeichenordner Ihrer App.
Öffnen Sie nun die Layoutdatei "main.xml" Ihrer App (res/layout/main.xml). Geben Sie eine Bildlaufansicht und ein lineares Layout wie folgt ein:
1 |
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" |
2 |
android:layout_width="fill_parent" |
3 |
android:layout_height="fill_parent" |
4 |
android:background="@drawable/back"> |
5 |
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
6 |
android:layout_width="fill_parent" |
7 |
android:layout_height="wrap_content" |
8 |
android:padding="10dp" |
9 |
android:orientation="vertical" > |
10 |
|
11 |
</LinearLayout>
|
12 |
</ScrollView>
|
Fügen Sie im linearen Layout die Einführung und dann eine Taste und eine Textansicht für jeden der vier Sensoren hinzu:
1 |
<TextView android:layout_width="fill_parent" |
2 |
android:layout_height="wrap_content" |
3 |
android:paddingBottom="10dp" |
4 |
android:textColor="#FFFFFF00" |
5 |
android:text="@string/hello" /> |
6 |
|
7 |
<Button android:id="@+id/ambient_btn" |
8 |
android:layout_height="wrap_content" |
9 |
android:layout_width="wrap_content" |
10 |
android:text="@string/ambient_label" |
11 |
android:background="@drawable/btn" /> |
12 |
<TextView android:id="@+id/ambient_text" |
13 |
android:paddingBottom="20dp" |
14 |
android:layout_width="fill_parent" |
15 |
android:layout_height="wrap_content" |
16 |
android:text="@string/text_placeholder" |
17 |
android:textColor="#FFFF66FF" |
18 |
android:textStyle="bold" /> |
19 |
|
20 |
<Button android:id="@+id/light_btn" |
21 |
android:layout_height="wrap_content" |
22 |
android:layout_width="wrap_content" |
23 |
android:text="@string/light_label" |
24 |
android:background="@drawable/btn" /> |
25 |
<TextView android:id="@+id/light_text" |
26 |
android:paddingBottom="20dp" |
27 |
android:layout_width="fill_parent" |
28 |
android:layout_height="wrap_content" |
29 |
android:text="@string/text_placeholder" |
30 |
android:textColor="#FFFF66FF" |
31 |
android:textStyle="bold" /> |
32 |
|
33 |
<Button android:id="@+id/pressure_btn" |
34 |
android:layout_height="wrap_content" |
35 |
android:layout_width="wrap_content" |
36 |
android:text="@string/pressure_label" |
37 |
android:background="@drawable/btn" /> |
38 |
<TextView android:id="@+id/pressure_text" |
39 |
android:paddingBottom="20dp" |
40 |
android:layout_width="fill_parent" |
41 |
android:layout_height="wrap_content" |
42 |
android:text="@string/text_placeholder" |
43 |
android:textColor="#FFFF66FF" |
44 |
android:textStyle="bold" /> |
45 |
|
46 |
<Button android:id="@+id/humidity_btn" |
47 |
android:layout_height="wrap_content" |
48 |
android:layout_width="wrap_content" |
49 |
android:text="@string/humidity_label" |
50 |
android:background="@drawable/btn" /> |
51 |
<TextView android:id="@+id/humidity_text" |
52 |
android:paddingBottom="20dp" |
53 |
android:layout_width="fill_parent" |
54 |
android:layout_height="wrap_content" |
55 |
android:text="@string/text_placeholder" |
56 |
android:textColor="#FFFF66FF" |
57 |
android:textStyle="bold" /> |
Jedes Tasten- und Textansichtspaar ist praktisch identisch, mit ID-Attributen, um sie im Java-Code zu identifizieren. Natürlich können Sie jedes Designelement ändern, wenn Sie dies wünschen. Das Layout bezieht sich auf die zeichnbaren Ressourcen und Zeichenfolgen.
Schritt 3: Benutzerinteraktion behandeln
Öffnen Sie die Hauptaktivitätsklasse Ihrer App. Fügen Sie am Anfang der Klassendeklaration vor der Methode "onCreate" die folgenden Instanzvariablen hinzu:
1 |
private Button ambientBtn, lightBtn, pressureBtn, humidityBtn; |
2 |
private TextView ambientValue, lightValue, pressureValue, humidityValue; |
Diese repräsentieren die Schaltflächen und Textansichten, die wir im Layout erstellt haben. Wir werden ein Array verwenden, um die Textansichtselemente zu verfolgen, da diese mit Informationen aktualisiert werden, wenn die Sensoren sie zurückgeben. Fügen Sie daher als Nächstes die folgende Arrayvariable hinzu:
1 |
private TextView[] valueFields = new TextView[4]; |
Fügen Sie nun diese Konstanten hinzu, um sich auf jeden Sensortyp zu beziehen:
1 |
private final int AMBIENT=0; |
2 |
private final int LIGHT=1; |
3 |
private final int PRESSURE=2; |
4 |
private final int HUMIDITY=3; |
Rufen Sie in der "onCreate"-Methode nach der Zeile, in der die Inhaltsansicht festgelegt ist, einen Verweis auf jede Schaltfläche mit den im Layout enthaltenen ID-Attributen wie folgt ab:
1 |
ambientBtn = (Button)findViewById(R.id.ambient_btn); |
2 |
lightBtn = (Button)findViewById(R.id.light_btn); |
3 |
pressureBtn = (Button)findViewById(R.id.pressure_btn); |
4 |
humidityBtn = (Button)findViewById(R.id.humidity_btn); |
Stellen Sie nun jede dieser Optionen so ein, dass die Aktivitätsklasse als Klick-Listener verwendet wird:
1 |
ambientBtn.setOnClickListener(this); |
2 |
lightBtn.setOnClickListener(this); |
3 |
pressureBtn.setOnClickListener(this); |
4 |
humidityBtn.setOnClickListener(this); |
Wenn diese Schaltflächen gedrückt werden, wird die Aktivitätsmethode "onClick" ausgeführt. Rufen Sie als Nächstes die Elemente der Textansicht ab und fügen Sie in jedem von uns deklarierten Array einen Verweis hinzu. Verwenden Sie dabei die Konstanten, um jeden Index anzugeben:
1 |
ambientValue = (TextView)findViewById(R.id.ambient_text); |
2 |
valueFields[AMBIENT]=ambientValue; |
3 |
lightValue = (TextView)findViewById(R.id.light_text); |
4 |
valueFields[LIGHT]=lightValue; |
5 |
pressureValue = (TextView)findViewById(R.id.pressure_text); |
6 |
valueFields[PRESSURE]=pressureValue; |
7 |
humidityValue = (TextView)findViewById(R.id.humidity_text); |
8 |
valueFields[HUMIDITY]=humidityValue; |
Jetzt müssen wir die "onClick"-Methode bereitstellen und sie nach der "onCreate"-Methode zur Klasse hinzufügen:
1 |
public void onClick(View v) |
2 |
{
|
3 |
|
4 |
}
|
Innerhalb der Methode müssen wir mithilfe einer Bedingung bestimmen, auf welche Taste geklickt wurde:
1 |
if (v.getId()==R.id.ambient_btn) |
2 |
{
|
3 |
//ambient temperature
|
4 |
|
5 |
}
|
6 |
else if(v.getId()==R.id.light_btn) |
7 |
{
|
8 |
//light
|
9 |
|
10 |
}
|
11 |
else if(v.getId()==R.id.pressure_btn) |
12 |
{
|
13 |
//pressure
|
14 |
|
15 |
}
|
16 |
else if(v.getId()==R.id.humidity_btn) |
17 |
{
|
18 |
//humidity
|
19 |
|
20 |
}
|
In jedem von diesen werden wir versuchen, die relevanten Umgebungsdaten abzurufen.
Schritt 4: Umgebungssensor einrichten
Fügen Sie am Anfang der Klasse einige Variablen für den Umgebungserkennungsprozess hinzu:
1 |
private SensorManager senseManage; |
2 |
private Sensor envSense; |
Fügen Sie in der "onCreate" -Methode nach dem vorhandenen Code Folgendes hinzu, um eine Instanz der Sensor Manager-Klasse zu erstellen:
1 |
senseManage = (SensorManager) getSystemService(Context.SENSOR_SERVICE); |
Wir benötigen den Sensor Manager für alle Umgebungserfassungsprozesse. Wir verwenden es, um bestimmte Sensoren abzurufen. Versuchen Sie innerhalb der "onClick"-Methode "if"-Anweisung für die Umgebungstemperatur, den Umgebungstemperatursensor wie folgt abzurufen:
1 |
envSense = senseManage.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE); |
Jetzt müssen wir uns um Fälle kümmern, in denen der Sensor nicht vom Benutzergerät bereitgestellt wird. Fügen Sie daher den folgenden Test hinzu:
1 |
if(envSense==null) |
2 |
Toast.makeText(this.getApplicationContext(), |
3 |
"Sorry - your device doesn't have an ambient temperature sensor!", |
4 |
Toast.LENGTH_SHORT).show(); |
Wir geben einfach eine Fehlermeldung aus. Wenn der Sensor vorhanden ist, müssen wir uns registrieren, um die zurückgegebenen Daten zu erhalten. Fügen Sie daher nach dieser "if"-Anweisung Folgendes hinzu:
1 |
else
|
2 |
senseManage.registerListener(this, envSense, SensorManager.SENSOR_DELAY_NORMAL); |
Führen Sie nun für jede der Schaltflächen in der "onClick"-Methode den gleichen Vorgang aus. Für den Lichttaste (in seiner "if"-Anweisung in "onClick"):
1 |
envSense = senseManage.getDefaultSensor(Sensor.TYPE_LIGHT); |
2 |
if(envSense==null) |
3 |
Toast.makeText(this.getApplicationContext(), |
4 |
"Sorry - your device doesn't have a light sensor!", |
5 |
Toast.LENGTH_SHORT).show(); |
6 |
else
|
7 |
senseManage.registerListener(this, envSense, SensorManager.SENSOR_DELAY_NORMAL); |
Beachten Sie, dass wir hier den Sensor "TYPE_LIGHT" anfordern und die Fehlermeldung auf den Sensortyp zuschneiden. Für den Drucktaste:
1 |
envSense = senseManage.getDefaultSensor(Sensor.TYPE_PRESSURE); |
2 |
if(envSense==null) |
3 |
Toast.makeText(this.getApplicationContext(), |
4 |
"Sorry - your device doesn't have a pressure sensor!", |
5 |
Toast.LENGTH_SHORT).show(); |
6 |
else
|
7 |
senseManage.registerListener(this, envSense, SensorManager.SENSOR_DELAY_NORMAL); |
Zum Schluss in der "if"-Anweisung für die Taste "Feuchtigkeit":
1 |
envSense = senseManage.getDefaultSensor(Sensor.TYPE_RELATIVE_HUMIDITY); |
2 |
if(envSense==null) |
3 |
Toast.makeText(this.getApplicationContext(), |
4 |
"Sorry - your device doesn't have a humidity sensor!", |
5 |
Toast.LENGTH_SHORT).show(); |
6 |
else
|
7 |
senseManage.registerListener(this, envSense, SensorManager.SENSOR_DELAY_NORMAL); |
Schritt 5: Abrufen von Genauigkeitsdaten
Zusätzlich zur Rückgabe der angeforderten Umgebungsdaten gibt der Sensor auch Genauigkeitsdaten zurück. Fügen Sie Ihrer Klasse die folgende Methode hinzu, die für die Implementierung der Sensorereignis Listener-Schnittstelle erforderlich ist:
1 |
@Override
|
2 |
public final void onAccuracyChanged(Sensor sensor, int accuracy) { |
3 |
|
4 |
}
|
Erstellen Sie innerhalb der Methode eine Meldung zur Genauigkeit:
1 |
String accuracyMsg = ""; |
Wir werden eine switch-Anweisung für den übergebenen Genauigkeits-Integer-Parameter verwenden:
1 |
switch(accuracy){ |
2 |
case SensorManager.SENSOR_STATUS_ACCURACY_HIGH: |
3 |
accuracyMsg="Sensor has high accuracy"; |
4 |
break; |
5 |
case SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM: |
6 |
accuracyMsg="Sensor has medium accuracy"; |
7 |
break; |
8 |
case SensorManager.SENSOR_STATUS_ACCURACY_LOW: |
9 |
accuracyMsg="Sensor has low accuracy"; |
10 |
break; |
11 |
case SensorManager.SENSOR_STATUS_UNRELIABLE: |
12 |
accuracyMsg="Sensor has unreliable accuracy"; |
13 |
break; |
14 |
default: |
15 |
break; |
16 |
}
|
Wir passen die Nachricht mithilfe der Sensor Manager-Klasse an die Genauigkeit des Sensors an. Geben Sie die Genauigkeit beim Empfang wie folgt aus, jedoch nach der switch-Anweisung:
1 |
Toast accuracyToast = Toast.makeText(this.getApplicationContext(), accuracyMsg, Toast.LENGTH_SHORT); |
2 |
accuracyToast.show(); |
Innerhalb der Methode "onAccuracyChanged" können Sie bei Bedarf auch den Sensortyp anhand des übergebenen Parameters bestimmen.
Schritt 6: Sensordaten abrufen
Jetzt können wir endlich die zurückgegebenen Daten mithilfe eines Sensorereignisses von den Sensoren abrufen - dies tun wir in der "onSensorChanged" -Methode, die auch für die Implementierung der Schnittstelle erforderlich ist:
1 |
@Override
|
2 |
public final void onSensorChanged(SensorEvent event) { |
3 |
|
4 |
}
|
Das Sensorereignis gibt seine Daten je nach Sensortyp auf unterschiedliche Weise zurück. Für alle vier von uns verwendeten Typen wird es auf die gleiche Weise aus dem ersten Element in einem Array von Gleitkommawerten abgerufen. Fügen Sie der Methode Folgendes hinzu:
1 |
float sensorValue = event.values[0]; |
Wir werden jetzt eine Textzeichenfolge mit diesen Daten erstellen und sie in die entsprechende Textansicht schreiben, damit der Benutzer sie sehen kann. Zuerst erstellen wir eine Textansichtsvariable und geben ihr einen Standardwert (dieser Wert wird überschrieben - wir fügen ihn hinzu, um Eclipse bei Laune zu halten):
1 |
TextView currValue = ambientValue; |
Als nächstes deklarieren wir den String:
1 |
String envInfo=""; |
Der Inhalt des Strings hängt vom Sensortyp ab. Lassen Sie uns also herausfinden, um welchen es sich handelt:
1 |
int currType=event.sensor.getType(); |
Jetzt können wir eine switch-Anweisung für diesen Wert verwenden:
1 |
switch(currType){ |
2 |
case Sensor.TYPE_AMBIENT_TEMPERATURE: |
3 |
envInfo=sensorValue+" degrees Celsius"; |
4 |
currValue=valueFields[AMBIENT]; |
5 |
break; |
6 |
case Sensor.TYPE_LIGHT: |
7 |
envInfo=sensorValue+" SI lux units"; |
8 |
currValue=valueFields[LIGHT]; |
9 |
break; |
10 |
case Sensor.TYPE_PRESSURE: |
11 |
envInfo=sensorValue+" hPa (millibars)"; |
12 |
currValue=valueFields[PRESSURE]; |
13 |
break; |
14 |
case Sensor.TYPE_RELATIVE_HUMIDITY: |
15 |
envInfo=sensorValue+" percent humidity"; |
16 |
currValue=valueFields[HUMIDITY]; |
17 |
break; |
18 |
default: break; |
19 |
}
|
In jedem Fall erstellen wir den informativen String unter Verwendung des abgerufenen Sensorwerts und eines für den Typ relevanten Textauszugs. Wir setzen die Textansicht auch mithilfe des Arrays und der Konstanten auf das entsprechende Element der Benutzeroberfläche. Geben Sie nach der switch-Anweisung die folgenden Informationen aus:
1 |
currValue.setText(envInfo); |
Setzen Sie nun die Sensorvariable zurück und warten Sie nicht mehr auf Aktualisierungen, um unnötigen Batterieverbrauch zu vermeiden:
1 |
envSense=null; |
2 |
senseManage.unregisterListener(this); |
Schließlich möchten wir nicht, dass die App unnötige Ressourcen verwendet, wenn sie angehalten wird. Fügen Sie diese Methode der Klasse hinzu:
1 |
@Override
|
2 |
protected void onPause() { |
3 |
super.onPause(); |
4 |
senseManage.unregisterListener(this); |
5 |
}
|
Schritt 7: Probieren Sie es aus
Das ist die komplette Demonstrations-App! Es macht keinen Sinn, diese App auf dem Standard-Android-Emulator auszuführen, da sie keine Umgebungssensoren bietet. Sie können es jedoch entweder auf einem tatsächlichen Gerät ausführen oder das Sensorsimulator-Werkzeug verwenden, mit dem Sie bestimmte Aspekte der Umgebung simulieren können. Das Folgende ist ein Screenshot der App, die auf dem Samsung Galaxy S III ausgeführt wird, kurz nachdem die Licht- und Druckdaten abgerufen wurden:

Hier ist es für die beiden anderen Sensoren, die nicht unterstützt werden:

Abschluss
Die Umgebungssensoren sind eine aufregende, aber sich noch entwickelnde Funktion der Android-Plattform. Es ist jedoch etwas früh, sich auf sie zu konzentrieren. Wenn Sie die Verwendung dieser Sensoren auf fortgeschrittenere Weise untersuchen möchten, lesen Sie den Abschnitt Entwicklerhandbuch zur Berechnung des Taupunkts und der absoluten Luftfeuchtigkeit auf der Grundlage der relativen Luftfeuchtigkeit und der Umgebungstemperatur. Ansonsten - versuche geduldig zu sein!



