写真とビデオのメディア ピッカー
この記事では、.NET マルチプラットフォーム アプリ 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 メソッドを使用します。
.NET MAUI