Kameraunabhängige Taschenlampe

In diesem Artikel wird beschrieben, wie Sie auf die Taschenlampe eines Geräts zugreifen und diese verwenden, sofern vorhanden. Die Taschenlampenfunktion wird unabhängig von der Kamera des Geräts und der Blitzfunktion der Kamera verwaltet. Neben dem Abrufen eines Verweises auf die Leuchte und dem Anpassen ihrer Einstellungen erfahren Sie in diesem Artikel auch, wie die Leuchtenressourcen korrekt freigegeben werden, wenn sie nicht verwendet wird. Außerdem wird beschrieben, wie Sie ermitteln können, wann sich die Verfügbarkeit der Leuchte ändert, falls sie von einer anderen App verwendet wird.

Abrufen der Standardleuchte des Geräts

Um die Standardleuchte des Geräts abzurufen, rufen Sie Lamp.GetDefaultAsync auf. Die Leuchten-APIs sind im Windows.Devices.Lights-Namespace zu finden. Achten Sie darauf, dass Sie eine „using“-Direktive für diesen Namespace hinzufügen, bevor Sie versuchen, auf diese APIs zuzugreifen.

using Windows.Devices.Lights;
Lamp lamp;
lamp = await Lamp.GetDefaultAsync();

if (lamp == null)
{
    ShowErrorMessage("No Lamp device found");
    return;
}

Wenn das zurückgegebene Objekt null ist, wird die Lamp-API auf dem Gerät nicht unterstützt. Einige Geräte unterstützen möglicherweise die Lamp-API nicht, auch wenn auf dem Gerät tatsächlich eine Leuchte vorhanden ist.

Abrufen einer bestimmten Leuchte mithilfe der Leuchtenauswahlzeichenfolge

Einige Geräte verfügen möglicherweise über mehrere Leuchten. Um eine Liste der auf dem Gerät verfügbaren Leuchten zu erhalten, rufen Sie die Geräteauswahlzeichenfolge ab, indem Sie GetDeviceSelector aufrufen. Diese Auswahlzeichenfolge kann dann an DeviceInformation.FindAllAsync übergeben werden. Diese Methode wird verwendet, um viele verschiedene Arten von Geräten aufzulisten. Mit der Auswahlzeichenfolge kann die Methode angewiesen werden, dass nur Geräte mit Leuchten zurückgegeben werden sollen. Das von FindAllAsync zurückgegeben DeviceInformationCollection-Objekt ist eine Sammlung von DeviceInformation-Objekten, die die auf dem Gerät verfügbaren Leuchten darstellen. Wählen Sie eines der Objekte in der Liste aus, und übergeben Sie dann die Id-Eigenschaft an Lamp.FromIdAsync, um einen Verweis auf die angeforderte Leuchte abzurufen. In diesem Beispiel wird die GetFirstOrDefault-Erweiterungsmethode aus dem System.Linq-Namespace zum Auswählen des DeviceInformation-Objekts verwendet, wobei die EnclosureLocation.Panel-Eigenschaft den Wert Back aufweist. Dadurch wird eine Leuchte auf der Rückseite des Gerätegehäuses ausgewählt, sofern vorhanden.

Beachten Sie, dass sich die DeviceInformation-APIs im Windows.Devices.Enumeration-Namespace befinden.

using Windows.Devices.Enumeration;
using System.Linq;
string selectorString = Lamp.GetDeviceSelector();


DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(selectorString);

DeviceInformation deviceInfo =
    devices.FirstOrDefault(di => di.EnclosureLocation != null && 
        di.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back);

if (deviceInfo == null)
{
    ShowErrorMessage("No Lamp device found");
}

lamp = await Lamp.FromIdAsync(deviceInfo.Id);

Anpassen der Leuchteneinstellungen

Nachdem Sie über eine Instanz der Lamp-Klasse verfügen, aktivieren Sie die Leuchte, indem Sie die IsEnabled-Eigenschaft auf true setzen.

lamp.IsEnabled = true;

Schalten Sie die Leuchte aus, indem Sie die IsEnabled-Eigenschaft auf false setzen.

lamp.IsEnabled = false;

Einige Geräte haben Leuchten, die Farbwerte unterstützen. Überprüfen Sie, ob eine Leuchte Farben unterstützt, indem Sie die IsColorSettable-Eigenschaft überprüfen. Wenn dieser Wert true ist, können Sie die Farbe der Leuchte mit der Color-Eigenschaft festlegen.

if (lamp.IsColorSettable)
{
    lamp.Color = Windows.UI.Colors.Blue;
}

Registrierung für Benachrichtigung, wenn sich die Leuchtenverfügbarkeit ändert

Zugriff auf die Leuchte wird der letzten App gewährt, die den Zugriff angefordert hat. Wenn also eine andere App gestartet wird, die eine Leuchtenressource anfordert, die Ihre App gerade verwendet, kann Ihre App die Leuchte erst wieder steuern, wenn die andere App die Ressource freigegeben hat. Um eine Benachrichtigung zu erhalten, wenn sich die Verfügbarkeit der Leuchte ändert, registrieren Sie einen Handler für das Lamp.AvailabilityChanged-Ereignis.

lamp = await Lamp.GetDefaultAsync();

if (lamp == null)
{
    ShowErrorMessage("No Lamp device found");
    return;
}

lamp.AvailabilityChanged += Lamp_AvailabilityChanged;

Überprüfen Sie im Handler für das Ereignis, ob es sich bei der Eigenschaftenänderung, die das Ereignis ausgelöst hat, um die LampAvailabilityChanged.IsAvailable-Eigenschaft handelte. In diesem Beispiel wird ein Umschalter zum An- und Ausschalten der Leuchte je nach Verfügbarkeit der Leuchte aktiviert oder deaktiviert.

private void Lamp_AvailabilityChanged(Lamp sender, LampAvailabilityChangedEventArgs args)
{
    lampToggleSwitch.IsEnabled = args.IsAvailable;
}

Ordnungsgemäßes Freigeben der Leuchtenressourcen, wenn diese nicht verwendet wird

Wenn Sie die Leuchte nicht mehr verwenden, sollten Sie sie deaktivieren und Lamp.Close aufrufen, um die Ressource freizugeben und anderen Apps den Zugriff auf die Leuchte zu ermöglichen. Diese Eigenschaft ist der Dispose-Methode zugewiesen, wenn Sie C# verwenden. Wenn Sie sich für AvailabilityChanged registriert haben, sollten Sie die Registrierung des Handlers aufheben, wenn Sie die Leuchtenressource freigeben. Der richtige Stelle in Ihrem Code für das Freigeben der Leuchtenressource ist von Ihrer App abhängig. Um den Leuchtenzugriff auf eine einzige Seite zu beschränken, geben Sie die Ressource im OnNavigatingFrom-Ereignis frei.

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
    lamp.AvailabilityChanged -= Lamp_AvailabilityChanged;
    lamp.IsEnabled = false;
    lamp.Dispose();
    lamp = null;
}