다음을 통해 공유


사진 및 비디오용 미디어 선택기

샘플을 찾아봅니다. 샘플 찾아보기

이 문서에서는 .NET 다중 플랫폼 앱 UI(.NET MAUI) IMediaPicker 인터페이스를 사용하는 방법을 설명합니다. 이 인터페이스를 사용하면 사용자가 디바이스에서 사진 또는 비디오를 선택하거나 찍을 수 있습니다.

인터페이스의 IMediaPicker 기본 구현은 속성을 통해 MediaPicker.Default 사용할 수 있습니다. IMediaPicker 인터페이스와 MediaPicker 클래스는 모두 네임스페이스에 Microsoft.Maui.Media 포함됩니다.

시작하기

미디어 선택기 기능에 액세스하려면 다음 플랫폼별 설정이 필요합니다.

CAMERA 권한이 필요하며 Android 프로젝트에서 구성해야 합니다. 추가:

  • 앱이 Android 12 이하를 대상으로 하는 경우 해당 권한과 WRITE_EXTERNAL_STORAGE 권한을 요청 READ_EXTERNAL_STORAGE 해야 합니다.

  • 앱이 Android 13 이상을 대상으로 하고 다른 앱이 만든 미디어 파일에 액세스해야 하는 경우 권한 대신 READ_EXTERNAL_STORAGE 다음 세분화된 미디어 권한 중 하나 이상을 요청해야 합니다.

    • READ_MEDIA_IMAGES
    • READ_MEDIA_VIDEO
    • READ_MEDIA_AUDIO

이러한 권한은 다음과 같은 방법으로 추가할 수 있습니다.

  • 어셈블리 기반 사용 권한을 추가합니다.

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

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

Platforms/Android/AndroidManifest.xml 파일에서 노드에 다음 queries/intent 노드를 manifest 추가합니다.

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

미디어 선택기 사용

IMediaPicker 인터페이스에는 파일의 위치를 얻거나 읽는 데 사용할 수 있는 모든 메서드가 반환FileResult되는 다음 메서드가 있습니다.

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

Important

권한 검사 및 요청은 .NET MAUI에서 자동으로 처리되므로 UI 스레드에서 모든 메서드를 호출해야 합니다.

사진 촬영

메서드를 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 메서드를 사용합니다.