Kameraunabhängige TaschenlampeCamera-independent Flashlight

In diesem Artikel wird beschrieben, wie Sie auf die Taschenlampe eines Geräts zugreifen und diese verwenden, sofern vorhanden.This article shows how to access and use a device's lamp, if one is present. Die Taschenlampenfunktion wird unabhängig von der Kamera des Geräts und der Blitzfunktion der Kamera verwaltet.Lamp functionality is managed separately from the device's camera and camera flash functionality. 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.In addition to acquiring a reference to the lamp and adjusting its settings, this article also shows you how to properly free up the lamp resource when it's not in use, and how to detect when the lamp's availability changes in case it is being used by another app.

Abrufen der Standardleuchte des GerätsGet the device's default lamp

Um die Standardleuchte des Geräts abzurufen, rufen Sie Lamp.GetDefaultAsync auf.To get a device's default lamp device, call Lamp.GetDefaultAsync. Die Leuchten-APIs sind im Windows.Devices.Lights-Namespace zu finden.The lamp APIs are found in the Windows.Devices.Lights namespace. Achten Sie darauf, dass Sie eine „using“-Direktive für diesen Namespace hinzufügen, bevor Sie versuchen, auf diese APIs zuzugreifen.Be sure to add a using directive for this namespace before attempting to access these APIs.

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.If the returned object is null, the Lamp API is unsupported on the device. Einige Geräte unterstützen möglicherweise die Lamp-API nicht, auch wenn auf dem Gerät tatsächlich eine Leuchte vorhanden ist.Some devices may not support the Lamp API even if there is a lamp physically present on the device.

Abrufen einer bestimmten Leuchte mithilfe der LeuchtenauswahlzeichenfolgeGet a specific lamp using the lamp selector string

Einige Geräte verfügen möglicherweise über mehrere Leuchten.Some devices may have more than one lamp. Um eine Liste der auf dem Gerät verfügbaren Leuchten zu erhalten, rufen Sie die Geräteauswahlzeichenfolge ab, indem Sie GetDeviceSelector aufrufen.To obtain a list of lamps available on the device, get the device selector string by calling GetDeviceSelector. Diese Auswahlzeichenfolge kann dann an DeviceInformation.FindAllAsync übergeben werden.This selector string can then be passed into DeviceInformation.FindAllAsync. 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.This method is used to enumerate many different kinds of devices and the selector string lets the method know to return only lamp devices. Das von FindAllAsync zurückgegeben DeviceInformationCollection-Objekt ist eine Sammlung von DeviceInformation-Objekten, die die auf dem Gerät verfügbaren Leuchten darstellen.The DeviceInformationCollection object returned from FindAllAsync is a collection of DeviceInformation objects representing the lamps available on the device. 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.Select one of the objects in the list and then pass the Id property to Lamp.FromIdAsync to get a reference to the requested lamp. 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.This example uses the GetFirstOrDefault extension method from the System.Linq namespace to select the DeviceInformation object where the EnclosureLocation.Panel property has a value of Back, which selects a lamp that is on the back of the device's enclosure, if one exists.

Beachten Sie, dass sich die DeviceInformation-APIs im Windows.Devices.Enumeration-Namespace befinden.Note that the DeviceInformation APIs are found in the Windows.Devices.Enumeration namespace.

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 LeuchteneinstellungenAdjust lamp settings

Nachdem Sie über eine Instanz der Lamp-Klasse verfügen, aktivieren Sie die Leuchte, indem Sie die IsEnabled-Eigenschaft auf true setzen.After you have an instance of the Lamp class, turn the lamp on by setting the IsEnabled property to true.

lamp.IsEnabled = true;

Schalten Sie die Leuchte aus, indem Sie die IsEnabled-Eigenschaft auf false setzen.Turn the lamp off by setting the IsEnabled property to false.

lamp.IsEnabled = false;

Einige Geräte haben Leuchten, die Farbwerte unterstützen.Some devices have lamps that support color values. Überprüfen Sie, ob eine Leuchte Farben unterstützt, indem Sie die IsColorSettable-Eigenschaft überprüfen.Check if a lamp supports color by checking the IsColorSettable property. Wenn dieser Wert true ist, können Sie die Farbe der Leuchte mit der Color-Eigenschaft festlegen.If this value is true, you can set the color of the lamp with the Color property.

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

Registrierung für Benachrichtigung, wenn sich die Leuchtenverfügbarkeit ändertRegister to be notified if the lamp availability changes

Zugriff auf die Leuchte wird der letzten App gewährt, die den Zugriff angefordert hat.Lamp access is granted to the most recent app to request access. 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.So, if another app is launched and requests a lamp resource that your app is currently using, your app will no longer be able to control the lamp until the other app has released the resource. Um eine Benachrichtigung zu erhalten, wenn sich die Verfügbarkeit der Leuchte ändert, registrieren Sie einen Handler für das Lamp.AvailabilityChanged-Ereignis.To receive a notification when the availability of the lamp changes, register a handler for the Lamp.AvailabilityChanged event.

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 the handler for the event, check the LampAvailabilityChanged.IsAvailable property to determine if the lamp is available. In diesem Beispiel wird ein Umschalter zum An- und Ausschalten der Leuchte je nach Verfügbarkeit der Leuchte aktiviert oder deaktiviert.In this example, a toggle switch for turning the lamp on and off is enabled or disabled based on the lamp availability.

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

Ordnungsgemäßes Freigeben der Leuchtenressourcen, wenn diese nicht verwendet wirdProperly dispose of the lamp resource when not in use

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.When you are no longer using the lamp, you should disable it and call Lamp.Close to release the resource and allow other apps to access the lamp. Diese Eigenschaft ist der Dispose-Methode zugewiesen, wenn Sie C# verwenden.This property is mapped to the Dispose method if you are using C#. Wenn Sie sich für AvailabilityChanged registriert haben, sollten Sie die Registrierung des Handlers aufheben, wenn Sie die Leuchtenressource freigeben.If you registered for the AvailabilityChanged, you should unregister the handler when you dispose of the lamp resource. Der richtige Stelle in Ihrem Code für das Freigeben der Leuchtenressource ist von Ihrer App abhängig.The right place in your code to dispose of the lamp resource depends on your app. Um den Leuchtenzugriff auf eine einzige Seite zu beschränken, geben Sie die Ressource im OnNavigatingFrom-Ereignis frei.To scope lamp access to a single page, release the resource in the OnNavigatingFrom event.

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