Torcia indipendente dalla fotocamera

Questo articolo illustra come accedere e utilizzare la lampada di un dispositivo, se presente. La funzionalità della lampada è gestita separatamente da quella della fotocamera e del flash del dispositivo. Oltre ad acquisire un riferimento alla lampada e regolarne le impostazioni, questo articolo illustra anche come liberare correttamente la risorsa lampada quando non è in uso e come rilevare quando la disponibilità della lampada cambia nel caso in cui venga usata da un'altra app.

Ottenere la lampada predefinita del dispositivo

Per ottenere il dispositivo lampada predefinito di un dispositivo, chiamare Lamp.GetDefaultAsync. Le API lamp sono disponibili nello spazio dei nomi Windows.Devices.Lights. Assicurarsi di aggiungere una direttiva using per questo spazio dei nomi prima di tentare di accedere a queste API.

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

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

Se l'oggetto restituito è null, l'API Lamp non è supportata nel dispositivo. Alcuni dispositivi potrebbero non supportare l'API Lamp anche se nel dispositivo è presente una lampada fisicamente.

Ottenere una lampada specifica usando la stringa del selettore lampada

Alcuni dispositivi possono avere più di una lampada. Per ottenere un elenco di lampade disponibili nel dispositivo, ottenere la stringa del selettore del dispositivo chiamando GetDeviceSelector. Questa stringa del selettore può quindi essere passata a DeviceInformation.FindAllAsync. Questo metodo viene usato per enumerare molti tipi diversi di dispositivi e la stringa del selettore consente al metodo di restituire solo i dispositivi lamp. L'oggetto DeviceInformationCollection restituito da FindAllAsync è una raccolta di DeviceInformation che rappresentano le lampade disponibili nel dispositivo. Selezionare uno degli oggetti nell'elenco e quindi passare la proprietà pd a Lamp.FromIdAsync per ottenere un riferimento alla lampada richiesta. In questo esempio viene utilizzato il metodo di estensione GetFirstOrDefault dallo spazio dei nomi System.Linq per selezionare l'oggetto DeviceInformation in cui la proprietà pnclosureLocation.Panel ha il valore Back, che seleziona una lampada che si trova sulla parte posteriore dell'enclosure del dispositivo, se presente.

Si noti che le DeviceInformation si trovano nello spazio dei nomi Windows.Devices.Enumeration.

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);

Regolare le impostazioni della lampada

Dopo aver creato un'istanza della classe Lamp, attivare la lampada impostando la proprietà IsEnabled su true.

lamp.IsEnabled = true;

Spegnere la lampada impostando la proprietà psEnabled su false.

lamp.IsEnabled = false;

Alcuni dispositivi hanno lampade che supportano valori di colore. Controllare se una lampada supporta il colore controllando la proprietà IsColorSettable. Se questo valore è true, è possibile impostare il colore della lampada con la proprietà Color .

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

Registrarsi per ricevere una notifica se la disponibilità della lampada cambia

L'accesso alla lampada viene concesso all'app più recente per richiedere l'accesso. Quindi, se viene avviata un'altra app e richiede una risorsa lampada attualmente in uso, l'app non sarà più in grado di controllare la lampada finché l'altra app non avrà liberato la risorsa. Per ricevere una notifica quando cambia la disponibilità della lampada, registrare un gestore per l'evento Lamp.AvailabilityChanged.

lamp = await Lamp.GetDefaultAsync();

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

lamp.AvailabilityChanged += Lamp_AvailabilityChanged;

Nel gestore per l'evento controllare la proprietà LampAvailabilityChanged.IsAvailable per determinare se la lampada è disponibile. In questo esempio, un interruttore per attivare e disattivare la lampada è abilitato o disabilitato in base alla disponibilità della lampada.

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

Eliminare correttamente la risorsa lampada quando non è in uso

Quando non si usa più la lampada, si deve disabilitarla e chiamare Lamp.Close per rilasciare la risorsa e consentire ad altre app di accedere alla lampada. Questa proprietà viene mappata al metodo Dispose se si usa C#. Se si è registrati per AvailabilityChanged, è necessario annullare la registrazione del gestore quando si elimina la risorsa lampada. La posizione giusta nel codice per eliminare la risorsa lampada dipende dall'app. Per definire l'ambito dell'accesso alla lampada a una singola pagina, rilasciare la risorsa nell'evento OnNavigatingFrom.

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