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 方法。

API