Loading...
Loading...
Guidance for picking photos/videos, capturing from camera, multi-select (.NET 10), MediaPickerOptions, platform permissions, and FileResult handling in .NET MAUI. USE FOR: "pick photo", "capture photo", "take picture", "pick video", "camera capture", "MediaPicker", "photo gallery", "image picker", "multi-select photos", "MediaPickerOptions". DO NOT USE FOR: general file picking (use maui-file-handling), image display or optimization (use maui-performance), or camera streaming (use maui-platform-invoke).
npx skill4agent add davidortinau/maui-skills maui-media-pickerMediaPicker.Default| Method | Purpose |
|---|---|
| Pick one photo from gallery |
| Pick one video from gallery |
| Capture a photo with the camera |
| Capture a video with the camera |
Task<FileResult?>| Method | Purpose |
|---|---|
| Pick multiple photos |
| Pick multiple videos |
Task<IEnumerable<FileResult>>MediaPickerOptionsvar options = new MediaPickerOptions
{
Title = "Select photos", // Picker dialog title
SelectionLimit = 5, // Max items (0 = unlimited; multi-select only)
MaximumWidth = 1024, // Resize max width in pixels
MaximumHeight = 1024, // Resize max height in pixels
CompressionQuality = 80, // JPEG quality 0–100
RotateImage = true, // Auto-rotate per EXIF
PreserveMetaData = true // Keep EXIF/metadata
};
var photos = await MediaPicker.Default.PickPhotosAsync(options);Platform note: Android and Windows may not enforce. Always validate the count in your code.SelectionLimit
var photo = await MediaPicker.Default.PickPhotoAsync();
if (photo is null)
return; // user cancelled
// Read the stream
using var stream = await photo.OpenReadAsync();
// Useful properties
string fullPath = photo.FullPath;
string fileName = photo.FileName;
string contentType = photo.ContentType;async Task<string> SaveToAppDataAsync(FileResult fileResult)
{
var targetPath = Path.Combine(FileSystem.AppDataDirectory, fileResult.FileName);
using var sourceStream = await fileResult.OpenReadAsync();
using var targetStream = File.OpenWrite(targetPath);
await sourceStream.CopyToAsync(targetStream);
return targetPath;
}Platforms/Android/AndroidManifest.xml<!-- Camera capture -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- Storage: API ≤ 32 (Android 12 and below) -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<!-- Storage: API ≥ 33 (Android 13+) -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /><application><queries>
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
</queries>Platforms/iOS/Info.plistPlatforms/MacCatalyst/Info.plist<key>NSCameraUsageDescription</key>
<string>This app needs camera access to take photos</string>
<key>NSMicrophoneUsageDescription</key>
<string>This app needs microphone access to record video</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app needs photo library access to pick media</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>This app needs permission to save photos</string>if (MediaPicker.Default.IsCaptureSupported)
{
var photo = await MediaPicker.Default.CapturePhotoAsync();
// ...
}var options = new MediaPickerOptions { SelectionLimit = 10 };
var results = await MediaPicker.Default.PickPhotosAsync(options);
if (!results.Any())
return; // user cancelled
foreach (var file in results)
{
using var stream = await file.OpenReadAsync();
// process each selected photo
}IsCaptureSupportedSelectionLimitOpenReadAsync()FileSystem.AppDataDirectory