カメラに依存しない懐中電灯Camera-independent Flashlight

この記事では、デバイスのライトにアクセスして使う方法を説明します (存在する場合)。This article shows how to access and use a device's lamp, if one is present. ライト機能は、デバイスのカメラやカメラのフラッシュ機能とは別に管理されます。Lamp functionality is managed separately from the device's camera and camera flash functionality. この記事では、ライトへの参照の取得および設定の調整に加えて、使用されていないときにライトのリソースを正しく解放する方法と、ライトが別のアプリで使用されている場合に利用状況の変化を検出する方法も説明します。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.

デバイスの既定のライトを取得するGet the device's default lamp

デバイスの既定のライトを取得するには、Lamp.GetDefaultAsync を呼び出します。To get a device's default lamp device, call Lamp.GetDefaultAsync. ライト関連 API は、Windows.Devices.Lights 名前空間にあります。The lamp APIs are found in the Windows.Devices.Lights namespace. これらの API にアクセスするには、この名前空間の using ディレクティブをあらかじめ追加しておく必要があります。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;
}

返されたオブジェクトが null の場合、そのデバイスでは Lamp API がサポートされていません。If the returned object is null, the Lamp API is unsupported on the device. 一部のデバイスでは、ライトが物理的には存在していても、Lamp API がサポートされていないことがあります。Some devices may not support the Lamp API even if there is a lamp physically present on the device.

ライト セレクター文字列を使って特定のランプを取得するGet a specific lamp using the lamp selector string

デバイスによっては、複数のライトが組み込まれている場合があります。Some devices may have more than one lamp. デバイスで利用可能なライトの一覧を取得するには、GetDeviceSelector を呼び出すことによってデバイスのセレクター文字列を取得します。To obtain a list of lamps available on the device, get the device selector string by calling GetDeviceSelector. このセレクター文字列は、DeviceInformation.FindAllAsync に渡すことができます。This selector string can then be passed into DeviceInformation.FindAllAsync. これは、さまざまな種類の多数のデバイスを列挙するために使うメソッドです。セレクター文字列はこのメソッドに対し、ライト デバイスのみを返すように伝えます。This method is used to enumerate many different kinds of devices and the selector string lets the method know to return only lamp devices. FindAllAsync から返される DeviceInformationCollection オブジェクトは、デバイスで利用可能なライトを表す DeviceInformation オブジェクトのコレクションになります。The DeviceInformationCollection object returned from FindAllAsync is a collection of DeviceInformation objects representing the lamps available on the device. 一覧からいずれかのオブジェクトを選択し、Id プロパティを Lamp.FromIdAsync に渡すと、要求されたライトへの参照を取得できます。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. この例では、System.Linq 名前空間の GetFirstOrDefault 拡張メソッドを使って、EnclosureLocation.Panel プロパティの値が Back である DeviceInformation オブジェクトを選択しています。これにより、デバイス エンクロージャの背面にあるライトが選択されます (存在する場合)。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.

DeviceInformation API は Windows.Devices.Enumeration 名前空間にあります。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);

ライトの設定を調整するAdjust lamp settings

Lamp クラスのインスタンスを作成した後、IsEnabled プロパティを true に設定することで、ライトをオンにします。After you have an instance of the Lamp class, turn the lamp on by setting the IsEnabled property to true.

lamp.IsEnabled = true;

ライトをオフにするには、IsEnabled プロパティを false に設定します。Turn the lamp off by setting the IsEnabled property to false.

lamp.IsEnabled = false;

デバイスによっては、ライトで色の値がサポートされていることがあります。Some devices have lamps that support color values. ライトで色がサポートされているかどうかを確認するには、IsColorSettable プロパティをチェックします。Check if a lamp supports color by checking the IsColorSettable property. この値が true であれば、Color プロパティを使ってライトの色を設定できます。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;
}

ライトの利用状況が変化したら通知されるよう登録するRegister to be notified if the lamp availability changes

ライトへのアクセス権は、アクセスを要求した最新のアプリに付与されます。Lamp access is granted to the most recent app to request access. このため、別のアプリが起動され、現在のアプリで使用中のライト リソースが要求された場合は、別のアプリからリソースが解放されるまで、現在のアプリではライトを制御できなくなります。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. ライトの利用状況が変化したときに通知を受け取るには、Lamp.AvailabilityChanged イベントに対するハンドラーを登録します。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;

このイベントのハンドラーでは、LampAvailabilityChanged.IsAvailable プロパティをチェックして、ライトを使用できるかどうかを確認します。In the handler for the event, check the LampAvailabilityChanged.IsAvailable property to determine if the lamp is available. この例では、ライトの利用可能性に基づいて、ライトをオンまたはオフにするトグル スイッチが有効または無効になります。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;
}

使用していないライト リソースを適切に破棄するProperly dispose of the lamp resource when not in use

ライトの使用が終わったら、ライトを無効にして Lamp.Close を呼び出すことにより、他のアプリがライトにアクセスできるようリソースを解放する必要があります。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. C# を使用している場合、このプロパティは Dispose メソッドにマップされています。This property is mapped to the Dispose method if you are using C#. AvailabilityChanged に登録した場合は、ライト リソースを破棄するときにハンドラーの登録を解除する必要があります。If you registered for the AvailabilityChanged, you should unregister the handler when you dispose of the lamp resource. ライト リソースを破棄するコードの適切な場所は、アプリによって異なります。The right place in your code to dispose of the lamp resource depends on your app. ライト アクセスのスコープを単一のページに限定するには、リソースを OnNavigatingFrom イベントで解放します。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;
}