Xamarin.Essentials:媒體選擇器
MediaPicker 類別可讓使用者在裝置上挑選或拍照或視訊。
開始使用
若要開始使用此 API,請閱讀 入門指南Xamarin.Essentials,以確保連結庫已正確安裝並設定在您的專案中。
若要存取 MediaPicker 功能,需要下列平臺特定設定。
需要下列許可權,而且必須在Android項目中設定。 能以下列方式新增:
開啟 [Properties] 資料夾下的 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 資訊清單:
開啟 [Properties] 資料夾下的 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 指令清單。
開啟 [Properties] 資料夾下的 AndroidManifest.xml 檔案並在 [manifest] 節點內新增下列內容:
<queries>
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
</queries>
使用媒體選擇器
類別 MediaPicker
具有下列方法,這些方法全都會傳回 FileResult
,可用來取得檔案位置或將它讀取為 Stream
。
PickPhotoAsync
:開啟媒體瀏覽器以選取相片。CapturePhotoAsync
:開啟相機以拍照。PickVideoAsync
:開啟媒體瀏覽器以選取視訊。CaptureVideoAsync
:開啟相機以拍攝視訊。
每個方法選擇性地採用 MediaPickerOptions
參數,允許 Title
在向使用者顯示的一些作業系統上設定 。
提示
所有方法都必須在 UI 線程上呼叫,因為許可權檢查和要求會自動由 Xamarin.Essentials處理。
一般使用方式
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
方法。