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