Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Von Bedeutung
Verwenden Sie stattdessen die UWP-Sensor-API .
Die COM-basierte Sensor-API ist veraltet und sollte nicht in neuen Anwendungen verwendet werden. Es sind keine zusätzlichen Features oder Verbesserungen geplant, und der Support wird eingeschränkt.
Es gibt zwei empfohlene Methoden zum Interpretieren und Verwenden von Lux-Daten, die von Umgebungslichtsensoren stammen.
- Wenden Sie eine Transformation auf die Daten an, damit die normalisierte Lichtstufe im direkten Verhältnis zu Programmverhalten oder Interaktionen verwendet werden kann. Ein Beispiel wäre, die Größe einer Schaltfläche in Ihrem Programm im direkten Verhältnis zu den normalisierten Daten zu variieren (oder einen Bereich der normalisierten Daten, die bspw. Außenbedingungen entsprechen). Dieser Ansatz bietet die optimale Implementierung.
- Verarbeiten Sie Bereiche von Luxwerten und ordnen Sie das Programmverhalten und die Reaktionen den oberen und unteren Schwellenwerten dieser Luxbereiche zu. Dies ist eine einfache Möglichkeit, auf Beleuchtungsbedingungen zu reagieren und die optimale Benutzererfahrung möglicherweise nicht zu erzielen. Dieser Ansatz funktioniert jedoch gut, wenn reibungslose Übergänge nicht machbar sind.
Verarbeiten von Daten aus mehreren Lichtsensoren
Um die genaue Annäherung der aktuellen Beleuchtungsbedingungen zu erzielen, können Sie Daten aus mehreren Umgebungslichtsensoren verwenden. Da Umgebungslichtsensoren teilweise oder vollständig von Schatten oder Objekten verdeckt werden können, die den Sensor abdecken, können mehrere Sensoren, die einen Abstand voneinander platziert haben, eine wesentlich bessere Annäherung der aktuellen Beleuchtungsbedingungen als ein einzelner Sensor bieten.
Um die Daten aus mehreren Sensoren nachzuverfolgen, können Sie die folgenden beiden Techniken verwenden:
- Der aktuellste Datenwert für jeden Umgebungslichtsensor kann zusammen mit dem Zeitstempel aus dem Sensordatenbericht für jede dieser Messwerte beibehalten werden. Der letzte empfangene ISensorDataReport für jede Sensorlese kann beibehalten werden und beide Werte für spätere Verweise bereitstellen. Durch Bezugnahme auf den Zeitstempel für jeden Sensordatenbericht können die Daten basierend auf ihrem Alter verwaltet werden. Wenn die Daten beispielsweise mehr als 2 Sekunden alt sind, kann sie weggelassen werden. Basierend auf den neueren Sensordatenwerten könnte der höchste Wert verwendet werden, da davon ausgegangen wird, dass der entsprechende Sensor nicht verdeckt ist.
- Sie können den letzten gemeldeten Umgebungslichtsensorwert verwenden. Diese Implementierung wäre nicht optimal, da die Werte aus mehreren Sensoren nicht miteinander verglichen werden, um das genaueste Ergebnis zu erhalten. Diese Methode wird nicht empfohlen.
Beispielcode
Der folgende Beispielcode zeigt eine Implementierung für das OnDataUpdated-Ereignis . Der Ereignishandler ruft eine Hilfsfunktion namens UpdateUI auf, die die Benutzeroberfläche basierend auf dem Lux-Wert ändert. Das Schreiben der Implementierung von UpdateUI liegt bei Ihnen.
// Override of ISensorEvents::OnDataUpdated
// Part of an event sink implementation for ISensorEvents
STDMETHODIMP CALSEventSink::OnDataUpdated(
ISensor* pSensor,
ISensorDataReport* pNewData)
{
HRESULT hr = S_OK;
if(pSensor == NULL ||
pNewData == NULL)
{
return E_POINTER;
}
// Declare and initialize the PROPVARIANT
PROPVARIANT lightLevel;
PropVariantInit(&lightLevel);
// Get the sensor reading from the ISensorDataReport object
hr = pNewData->GetSensorValue(
SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX,
&lightLevel);
if(SUCCEEDED(hr))
{
if(lightlevel.vt == VT_R4)
{
// Extract the float value from the PROPVARIANT object
float luxValue = lightLevel.fltVal;
// Normalize the light sensor data
double lightNormalized = ::log10(luxValue) / 5.0;
// Handle UI changes based on the normalized LUX data
// which ranges from 0.0 - 1.0 for a lux range of
// 0 lux to 100,000 lux.
UpdateUI(lightNormalized);
}
}
// Release the variant.
PropVariantClear(&lightLevel);
return hr;
}