分享方式:


相片和影片的媒體選擇器

Browse sample. 流覽範例

本文說明如何使用 .NET 多平臺應用程式 UI (.NET MAUI) IMediaPicker 介面。 此介面可讓使用者在裝置上挑選或拍攝相片或視訊。

介面的預設實作 IMediaPicker 可透過 MediaPicker.Default 屬性取得。 IMediaPicker介面和MediaPicker類別都包含在 命名空間中Microsoft.Maui.Media

開始使用

若要存取媒體選擇器功能,需要下列平臺特定設定。

需要 CAMERA 權限,而且必須在 Android 專案中設定。 此外:

  • 如果您的應用程式以 Android 12 或更低版本為目標,您必須要求 READ_EXTERNAL_STORAGEWRITE_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,可用來取得檔案的位置或讀取它。

每個方法選擇性地採用 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 方法。