カメラに依存しない懐中電灯

この記事では、デバイスのライトにアクセスして使う方法を説明します (存在する場合)。 ライト機能は、デバイスのカメラやカメラのフラッシュ機能とは別に管理されます。 この記事では、ライトへの参照の取得および設定の調整に加えて、使用されていないときにライトのリソースを正しく解放する方法と、ライトが別のアプリで使用されている場合に利用状況の変化を検出する方法も説明します。

デバイスの既定のライトを取得する

デバイスの既定のライトを取得するには、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 プロパティの値が Back である DeviceInformation オブジェクトを選択しています。これにより、デバイス エンクロージャの背面にあるライトが選択されます (存在する場合)。

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