相機獨立閃光燈

本文介紹如何存取和使用裝置的燈光 (如果存在)。 燈光功能會與裝置的相機和相機閃光燈功能分開管理。 除了取得燈光的參考並調整其設定之外,本文也會說明如何在未使用燈光資源時適當釋放燈光資源,以及如何偵測燈光的可用性變更,以防另一個應用程式使用燈光的可用性變更。

取得裝置的預設燈光

若要取得裝置的預設燈光裝置,請呼叫 Lamp.GetDefaultAsync。 燈光 API 位於 Windows.Devices.Lights 命名空間中。 在嘗試存取這些 API 之前,請務必為此命名空間新增 using 指示詞。

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

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

如果傳回的物件為 null,則裝置不支援 Lamp API。 即使裝置上實際存在燈光,某些裝置也可能不支援 Lamp API。

使用燈光選取器字串取得特定燈光

某些裝置可能有多個燈光。 若要取得裝置上可用的燈光清單,請呼叫 GetDeviceSelector 來取得裝置選取器字串。 然後,這個選取器字串可以傳遞至 DeviceInformation.FindAllAsync。 這個方法可用來列舉許多不同類型的裝置,而選取器字串可讓方法知道只傳回燈光裝置。 從 FindAllAsync 傳回的 DeviceInformationCollection 物件是表示裝置上可用燈光的 DeviceInformation 物件的集合。 選取清單中的物件之一,然後將 Id 屬性傳遞給 Lamp.FromIdAsync 以取得所請求燈光的參考。 此範例使用 System.Linq 命名空間中的 GetFirstOrDefault 擴充方法來選取 EnclosureLocation.Panel 屬性值為 BackDeviceInformation 物件,該物件選取位於裝置外殼背面的燈光 (如果存在)。

請注意,DeviceInformation API 位於 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);

調整燈光設定

取得 Lamp 類別的執行個體後,透過將 IsEnabled 屬性設為 true 來開啟燈光。

lamp.IsEnabled = true;

透過將 IsEnabled 屬性設為 false 來關閉燈光。

lamp.IsEnabled = false;

某些裝置有支援色彩值的燈光。 透過檢查 IsColorSettable 屬性來檢查燈光是否支援色彩。 如果值為 true,則可以使用 Color 屬性來設定燈光的色彩。

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

註冊以在燈光可用性變更時收到通知

燈光存取權限被授予最近請求存取權限的應用程式。 因此,如果啟動另一個應用程式並請求您的應用程式目前正在使用的燈光資源,則您的應用程式將無法再控制燈光,直到另一個應用程式釋放該資源。 若要在燈光的可用性變更時接收通知,請註冊 Lamp.AvailabilityChanged 事件的處理常式。

lamp = await Lamp.GetDefaultAsync();

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

lamp.AvailabilityChanged += Lamp_AvailabilityChanged;

在事件的處理常式中,檢查 LampAvailabilityChanged.IsAvailable 屬性以確定燈光是否可用。 在此範例中,開啟和關閉燈的切換開關會根據燈光可用性啟用或停用。

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

在不使用時適當處置燈光資源

當您不再使用燈光時,您應該停用它並呼叫 Lamp.Close 來釋放資源並允許其他應用程式存取燈光。 如果您使用的是 C#,則此屬性將對應到 Dispose 方法。 如果您註冊了 AvailabilityChanged,則應在處置燈光資源時登出該處理常式。 在您的程式碼中處置燈光資源的正確位置取決於您的應用程式。 若要將燈光存取範圍限制為單一頁面,請在 OnNavigatingFrom 事件中釋放資源。

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