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
メソッドを使用します。