写真とビデオのメディア ピッカー

Browse sample. サンプルを参照する

この記事では、.NET Multi-Platform App UI (.NET MAUI) IMediaPicker インターフェイスを使用する方法について説明します。 このインターフェイスを使用すると、ユーザーはデバイス上で写真やビデオを選択または撮影できます。

IMediaPicker インターフェイスの既定の実装は、MediaPicker.Default プロパティを通じて利用できます。 IMediaPicker インターフェイスと MediaPicker クラスはどちらも Microsoft.Maui.Media 名前空間に含まれています。

作業の開始

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

CAMERA アクセス許可が必要です。Android プロジェクト内で構成する必要があります。 さらに:

  • アプリが Android 12 以前を対象とする場合は、READ_EXTERNAL_STORAGE および WRITE_EXTERNAL_STORAGE アクセス許可を要求する必要があります。

  • アプリが Android 13 以降を対象とし、他のアプリが作成したメディア ファイルへのアクセスが必要な場合は、READ_EXTERNAL_STORAGE アクセス許可ではなく、次の詳細なメディア アクセス許可を 1 つ以上要求する必要があります。

    • READ_MEDIA_IMAGES
    • READ_MEDIA_VIDEO
    • READ_MEDIA_AUDIO

これらのアクセス許可は、次の方法で追加できます。

  • アセンブリ ベースのアクセス許可を追加します。

    Platforms/Android/MainApplication.cs ファイルを開き、using ディレクティブの後に次のアセンブリ属性を追加します。

    // Needed for Picking photo/video
    [assembly: UsesPermission(Android.Manifest.Permission.ReadExternalStorage, MaxSdkVersion = 32)]
    [assembly: UsesPermission(Android.Manifest.Permission.ReadMediaAudio)]
    [assembly: UsesPermission(Android.Manifest.Permission.ReadMediaImages)]
    [assembly: UsesPermission(Android.Manifest.Permission.ReadMediaVideo)]
    
    // Needed for Taking photo/video
    [assembly: UsesPermission(Android.Manifest.Permission.Camera)]
    [assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage, MaxSdkVersion = 32)]
    
    // 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 マニフェストを更新します。

    Platforms/Android/AndroidManifest.xml ファイルを開き、manifest ノードに次を追加します。

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />    
    <!-- Required only if your app needs to access images or photos that other apps created -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <!-- Required only if your app needs to access videos that other apps created -->
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
    <!-- Required only if your app needs to access audio files that other apps created -->
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />    
    

    または

  • マニフェスト エディターで Android マニフェストを更新します。

    Visual Studio で、Platforms/Android/AndroidManifest.xml ファイルをダブルクリックして、Android マニフェスト エディターを開きます。 次に、[必要なアクセス許可] で、上記に一覧表示されたアクセス許可をチェックします。 これにより、AndroidManifest.xml ファイルが自動的に更新されます。

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

Platforms/Android/AndroidManifest.xml ファイルで、manifest ノードに次の queries/intent ノードを追加します。

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

メディア ピッカーを使用する

IMediaPicker インターフェイスには、ファイルの場所を取得したり読み込んだりするための、FileResult を返す以下のメソッドがあります。

  • PickPhotoAsync
    メディア ブラウザーを開いて、写真を選択します。

  • CapturePhotoAsync
    カメラを開いて、写真を撮影します。

  • PickVideoAsync
    メディア ブラウザーを開いて、ビデオを選択します。

  • CaptureVideoAsync
    カメラを開いて、ビデオを撮影します。

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

重要

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

写真を撮る

CapturePhotoAsync メソッドを呼び出してカメラを開き、ユーザーが写真を撮影するようにします。 ユーザーが写真を撮影した場合、メソッドの戻り値は null 以外の値になります。 次のコード サンプルでは、メディア ピッカーを使用して写真を撮影し、キャッシュ ディレクトリに保存します。

public async void TakePhoto()
{
    if (MediaPicker.Default.IsCaptureSupported)
    {
        FileResult photo = await MediaPicker.Default.CapturePhotoAsync();

        if (photo != null)
        {
            // save the file into local storage
            string localFilePath = Path.Combine(FileSystem.CacheDirectory, photo.FileName);

            using Stream sourceStream = await photo.OpenReadAsync();
            using FileStream localFileStream = File.OpenWrite(localFilePath);

            await sourceStream.CopyToAsync(localFileStream);
        }
    }
}

ヒント

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