相片和影片的媒體選擇器
本文說明如何使用 .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
許可權:READ_MEDIA_IMAGES
READ_MEDIA_VIDEO
READ_MEDIA_AUDIO
這些權限可以透過下列方式新增:
新增元件型權限:
開啟 Platform/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 指令清單:
開啟 [平臺/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 中,按兩下 [平臺/Android/AndroidManifest.xml ] 檔案,以開啟 Android 指令清單編輯器。 然後,在 [必要許可權] 底下,檢查上面所列的許可權。 這將會自動更新 AndroidManifest.xml 檔案。
如果您的項目目標 Android 版本設定為 Android 11(R API 30)或更高版本,您必須使用使用 Android 套件可見性需求的查詢來更新 Android 指令清單。
在 [平臺/Android/AndroidManifest.xml] 檔案中,在 節點中manifest
新增下列queries/intent
節點:
<queries>
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
</queries>
使用媒體選擇器
介面 IMediaPicker 具有下列方法,全都會傳回 FileResult,可用來取得檔案的位置或讀取它。
PickPhotoAsync
開啟媒體瀏覽器以選取相片。CapturePhotoAsync
開啟相機以拍照。PickVideoAsync
開啟媒體瀏覽器以選取影片。CaptureVideoAsync
開啟相機以拍攝視訊。
每個方法選擇性地採用 MediaPickerOptions 參數類型,以允許 Title 在某些作業系統上設定,而該操作系統會顯示給使用者。
重要
所有方法都必須在UI線程上呼叫,因為 .NET MAUI 會自動處理許可權檢查和要求。
拍攝相片
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 方法。