情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 用の Direct3D アプリから写真ピッカーを使用する方法

2014/06/18

対象: Windows Phone 8 および Windows Phone Silverlight 8.1 のみ

 

ここでは、Windows Phone Direct3D アプリ から写真ピッカーを表示して、ユーザーが電話の写真ライブラリから写真を選択できるようにする方法について説明します。写真は StorageFile オブジェクトとしてアプリに返されます。

写真ピッカーは、PickSingleFileAsync() メソッドを使用して起動されます。Windows 8 では、このメソッドは任意の種類のファイルを選択するために使用できますが、Windows Phone では画像のみを選択できます。このため、FileOpenPicker オブジェクトのいくつかのプロパティを正しく設定しないと、ピッカーは起動されません。これらのプロパティと必須な値を次の表に示します。

プロパティ

必須の値

ViewMode

PickerViewMode::Thumbnail

SuggestedStartLocation

PickerLocationId::PicturesLibrary

FileTypeFilter

“*”

ピッカー操作が完了した後、ユーザーがアプリから移動して、アプリが中断されている場合、ResumePickSingleFileAsync() を呼び出すことによって、アプリで選択操作を再開し、ユーザーが選択したファイルを取得できます。Windows Phone では、PickSingleFileAsync() メソッドにオプションの ID パラメーターがあります。アプリが複数の写真ピッカーを使用する場合、このアプリ定義の ID 文字列を使用して、アプリが中断される前に起動されたピッカーを識別できます。

写真ピッカーの使用

  1. 新しい Windows Phone Direct3D アプリ を作成します。この例は、プロジェクトに NativePhotoPicker という名前を付けていることを前提としています。

  2. Completed イベントのイベント ハンドラーの宣言を、NativePhotoPicker.h ヘッダー ファイルに追加します。このイベントは、写真の選択操作が完了したときに呼び出されます。この操作の結果の型は、返された画像を格納する StorageFile への参照です。

    
    	void PickSingleFileCompletedHandler(Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFile^>^ operation, Windows::Foundation::AsyncStatus status);
    
    
    
  3. 現在アクティブなピッカーのアプリ定義の ID を格納するメンバー変数を宣言します。アプリが複数のピッカーを使用している場合、この変数によってどのピッカーが返されたかを特定できます。アプリでピッカーを 1 つだけ使用する場合は、この手順をスキップできます。

    
    	Platform::String^ m_pickerID;
    
    
    
  4. Windows.Storage および Windows.Storage.Pickers 名前空間を参照する using ステートメントを NativePhotoPicker.cpp の先頭に追加します。

  5. FileOpenPicker クラスの新規インスタンスを作成します。このトピックで前に説明したように、FileOpenPicker のビュー モード、開始位置、およびファイルの種類フィルターについて、設定しておく必要がある必須の値があります。これらの値を設定しない場合、選択操作は失敗します。

    選択操作を開始するには、PickSingleFileAsync() を呼び出します。この例では、単一の文字列を使用するこのメソッドのオーバーロードを使用して、選択操作中にアプリが中断された後、再開された場合に、どの選択操作が進行中であるかを追跡する方法を示します。アプリでピッカーを 1 つだけ使用する場合は、この手順をスキップできます。

    最後に、Completed() によって返された IAsyncOperation オブジェクトの PickSingleFileAsync() イベントのイベント ハンドラーをフックします。

    この例では、Direct3D アプリ のプロジェクト テンプレートに含まれる OnPointerPressed メソッドに、写真ピッカーを起動するコードを配置しています。このハンドラーは、ユーザーが画面にタッチしたときに呼び出されます。

    
    void NativePhotoPicker::OnPointerPressed(CoreWindow^ sender, PointerEventArgs^ args)
    {
        // Insert event handling here
    	FileOpenPicker^ fileOpenPicker = ref new FileOpenPicker();
    	fileOpenPicker->ViewMode = PickerViewMode::Thumbnail;
    	fileOpenPicker->SuggestedStartLocation = PickerLocationId::PicturesLibrary;
    	fileOpenPicker->FileTypeFilter->Append("*");
    
    	m_pickerID = "ID_12345";
    	IAsyncOperation<StorageFile^>^ pickSingleFileOperation = fileOpenPicker->PickSingleFileAsync(m_pickerID);
    
    	pickSingleFileOperation->Completed = ref new AsyncOperationCompletedHandler<StorageFile^>(this, &NativePhotoPicker::PickSingleFileCompletedHandler);
    }
    
    
    
  6. Completed() イベント ハンドラーの実装を追加します。GetResults() を呼び出して、イメージ データを格納する StorageFile オブジェクトを取得します。複数のピッカーを使用している場合は、ピッカー ID を格納しているメンバー変数を調べることによって、このイベントを起動したピッカーを確認できます。

    
    void NativePhotoPicker::PickSingleFileCompletedHandler(IAsyncOperation<Windows::Storage::StorageFile^>^ operation, AsyncStatus status)
    {
    	StorageFile^ file = operation->GetResults();
    
    	if(m_pickerID == "ID_12345")
    	{
    		// Do something with the file.
    	}
    }
    
    
    
  7. アプリのアクティブ化と非アクティブ化を処理するコードを追加します。Windows Phone では、ピッカー操作の途中でアプリが中断された後、再びアクティブ化される可能性があります。アプリが中断されたときに、操作がユーザーによって完了されていた場合、ピッカーはユーザーが操作を取り消した場合と同様に、単に自動的に終了します。ただし、ユーザーがピッカー操作を完了したが、Completed() イベントが発生する前にアプリが中断されている場合、アプリの IActivatedEventArgs イベントに渡される Activated には、ActivationKind::PickerReturned の値を含む Kind プロパティがあります。この場合、args オブジェクトを IPickerReturnedActivatedEventArgs オブジェクトとしてキャストし、ピッカーの起動時に ID を指定した PickerOperationId() プロパティを取得できます。次に、単に ResumePickSingleFileAsync() を呼び出して、選択操作を続行し、前に結果の処理に使用したものと同じイベント ハンドラーをフックします。

    
    void NativePhotoPicker::OnActivated(CoreApplicationView^ applicationView, IActivatedEventArgs^ args)
    {
        CoreWindow::GetForCurrentThread()->Activate();
    	
    	if(args->Kind == ActivationKind::PickerReturned)
    	{
    		m_pickerID = ((IPickerReturnedActivatedEventArgs^)args)->PickerOperationId;
    
    		IAsyncOperation<StorageFile^>^ pickSingleFileOperation = FileOpenPicker::ResumePickSingleFileAsync();
    		pickSingleFileOperation->Completed = ref new AsyncOperationCompletedHandler<StorageFile^>(this, &NativePhotoPicker::PickSingleFileCompletedHandler);
    	}
    }
    
    
    

アプリの中断とアクティブ化によるピッカーのテスト

  • アプリ開発中に、アプリの中断やアクティブ化をアプリケーションが正しく処理するかどうかをテストします。Visual Studio で、[プロジェクト] メニューの [&lt;プロジェクト名&gt; のプロパティ] をクリックします。 [プロパティ ページ] ダイアログ ボックスで、[構成プロパティ] の下の [デバッグ] をクリックします。[デバッグ時に非アクティブ化されたら廃棄状態にする] の値を [はい] に変更します。これで、デバッグを有効にしてアプリを起動した後、写真ピッカーを起動すると、アプリは自動的に中断されます。[戻る] ボタンを使用してアプリに戻ったときに、Activated イベント ハンドラー内のコードが実行され、選択したイメージを使用してカスタム イベント ハンドラーを呼び出します。

表示: