Xamarin.Essentials: メディア ピッカー

MediaPicker クラスを使用すると、ユーザーはデバイス上で写真やビデオを選択したり、撮影したりすることができます。

作業開始

この API の使用を始めるには、Xamarin.Essentials の概要ガイドを読み、ライブラリが正しくインストールされてプロジェクトに設定されていることを確認してください。

MediaPicker の機能にアクセスするには、次のプラットフォーム固有の設定が必要です。

次のアクセス許可が必要であり、Android プロジェクトで構成する必要があります。 これは次の方法で追加できます。

[プロパティ] フォルダーにある AssemblyInfo.cs ファイルを開き、以下を追加します。

// Needed for Picking photo/video
[assembly: UsesPermission(Android.Manifest.Permission.ReadExternalStorage)]

// Needed for Taking photo/video
[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
[assembly: UsesPermission(Android.Manifest.Permission.Camera)]

// Add these properties if you would like to filter out devices that do not have cameras, or set to false to make them optional
[assembly: UsesFeature("android.hardware.camera", Required = true)]
[assembly: UsesFeature("android.hardware.camera.autofocus", Required = true)]

または、Android マニフェストを追加します。

[プロパティ] フォルダーにある AndroidManifest.xml ファイルを開き、manifest ノードの内部に以下を追加します。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

または、Android プロジェクトを右クリックし、プロジェクトのプロパティを開きます。 [Android マニフェスト] の下で [必要なアクセス許可] 領域を探し、これらのアクセス許可を確認します。 これにより、AndroidManifest.xml ファイルが自動的に更新されます。

プロジェクトのターゲット Android バージョンが Android 11 (R API 30) に設定される場合、新しいパッケージの可視性要件で使用されるクエリで Android マニフェストを更新する必要があります。

[プロパティ] フォルダーにある AndroidManifest.xml ファイルを開き、manifest ノードの内部に以下を追加します。

<queries>
  <intent>
    <action android:name="android.media.action.IMAGE_CAPTURE" />
  </intent>
</queries>

メディア ピッカーの使用

MediaPicker クラスには、ファイルの場所を取得したり、それを Stream として読み取るために使用したりできる FileResult を返す、次のメソッドがあります。

  • PickPhotoAsync: メディア ブラウザーを開いて、写真を選択します。
  • CapturePhotoAsync: カメラを開いて、写真を撮影します。
  • PickVideoAsync: メディア ブラウザーを開いて、ビデオを選択します。
  • CaptureVideoAsync: カメラを開いて、ビデオを撮影します。

各メソッドでは、必要に応じて、ユーザーに表示される一部のオペレーティング システムで Title を設定できるようにする MediaPickerOptions パラメーターが取り込まれます。

ヒント

アクセス許可の確認と要求が Xamarin.Essentials によって自動的に処理されるため、UI スレッドではすべてのメソッドを呼び出す必要があります。

一般的な使用法

async Task TakePhotoAsync()
{
    try
    {
        var photo = await MediaPicker.CapturePhotoAsync();
        await LoadPhotoAsync(photo);
        Console.WriteLine($"CapturePhotoAsync COMPLETED: {PhotoPath}");
    }
    catch (FeatureNotSupportedException fnsEx)
    {
        // Feature is not supported on the device
    }
    catch (PermissionException pEx)
    {
        // Permissions not granted
    }
    catch (Exception ex)
    {
        Console.WriteLine($"CapturePhotoAsync THREW: {ex.Message}");
    }
}

async Task LoadPhotoAsync(FileResult photo)
{
    // canceled
    if (photo == null)
    {
        PhotoPath = null;
        return;
    }
    // save the file into local storage
    var newFile = Path.Combine(FileSystem.CacheDirectory, photo.FileName);
    using (var stream = await photo.OpenReadAsync())
    using (var newStream = File.OpenWrite(newFile))
        await stream.CopyToAsync(newStream);

    PhotoPath = newFile;
}

ヒント

プロパティ FullPath は、ファイルへの物理パスを常に返すわけではありません。 ファイルを取得するには、OpenReadAsync メソッドを使用します。

API