Xamarin.Essentials: 미디어 선택기

MediaPicker 클래스를 통해 사용자는 디바이스에서 사진 또는 비디오를 선택하거나 촬영할 수 있습니다.

시작하기

이 API를 사용하기 전에 라이브러리가 제대로 설치되고 프로젝트에 설정되어 있는지 확인하기 위해 Xamarin.Essentials에 대한 시작 가이드를 읽어보세요.

MediaPicker 기능에 액세스하려면 다음 플랫폼 관련 설정이 필요합니다.

다음 권한이 필요하며 Android 프로젝트에서 구성해야 합니다. 이 권한은 다음과 같은 방법으로 추가할 수 있습니다.

속성 폴더 아래의 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 매니페스트를 업데이트합니다.

속성 폴더 아래의 AndroidManifest.xml 파일을 열고 매니페스트 노드 내부에 다음을 추가합니다.

<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 매니페스트를 업데이트해야 합니다.

속성 폴더 아래의 AndroidManifest.xml 파일을 열고 매니페스트 노드 내부에 다음을 추가합니다.

<queries>
  <intent>
    <action android:name="android.media.action.IMAGE_CAPTURE" />
  </intent>
</queries>

미디어 선택기 사용

MediaPicker 클래스에는 파일 위치를 가져오거나 Stream으로 읽는 데 사용할 수 있는 FileResult를 모두 반환하는 다음과 같은 메서드가 있습니다.

  • PickPhotoAsync: 미디어 브라우저를 열어 사진을 선택합니다.
  • CapturePhotoAsync: 사진을 찍을 카메라를 엽니다.
  • PickVideoAsync: 미디어 브라우저를 열어 비디오를 선택합니다.
  • CaptureVideoAsync: 비디오를 찍을 카메라를 엽니다.

각 메서드는 사용자에게 표시되는 일부 운영 체제에서 Title이 설정될 수 있게 하는 MediaPickerOptions 매개 변수를 선택적으로 사용합니다.

사용 권한 검사 및 요청은 Xamarin.Essentials에서 자동으로 처리되기 때문에 UI 스레드에서 모든 메서드를 호출해야 합니다.

일반적인 사용법

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