Maui 照片和视频的媒体选取器

[删除(380066935@qq.com或微信通知)]

更好的阅读体验请查看原文:https://learn.microsoft.com/zh-cn/dotnet/maui/platform-integration/device-media/picker?view=net-maui-7.0&tabs=android

本文介绍如何使用 .NET 多平台应用 UI (.NET MAUI) IMediaPicker 接口。 此界面允许用户在设备上选取或拍摄照片或视频。

接口的默认实现 IMediaPicker 可通过 MediaPicker.Default 属性获得。 IMediaPicker接口和 MediaPicker 类都包含在 命名空间中Microsoft.Maui.Media

入门

若要访问媒体选取器功能,需要以下特定于平台的设置。

CAMERAWRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE 权限是必需的,并且必须在 Android 项目中配置。 可通过以下方式添加这些内容:

  • 添加基于程序集的权限:

    打开 Platforms/Android/MainApplication.cs 文件,并在指令后面 using 添加以下程序集属性:

    // 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 清单:

    打开 “平台/Android/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 11 (R API 30) 或更高版本,则必须使用使用 Android 包可见性要求的查询更新 Android 清单

“平台/Android/AndroidManifest.xml ”文件中,将以下 queries/intent 节点 manifest 添加到节点:

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