diff --git a/Samples/Samples.iOS/Info.plist b/Samples/Samples.iOS/Info.plist
index 879f584ac..652ed205a 100644
--- a/Samples/Samples.iOS/Info.plist
+++ b/Samples/Samples.iOS/Info.plist
@@ -22,7 +22,7 @@
UIInterfaceOrientationLandscapeRight
MinimumOSVersion
- 10.0
+ 14.5
CFBundleDisplayName
Xamarin.Essentials
CFBundleIdentifier
diff --git a/Samples/Samples/View/MediaPickerPage.xaml b/Samples/Samples/View/MediaPickerPage.xaml
index efac0d742..5dddb8566 100644
--- a/Samples/Samples/View/MediaPickerPage.xaml
+++ b/Samples/Samples/View/MediaPickerPage.xaml
@@ -1,22 +1,30 @@
-
+
-
-
-
-
+
+
+
+
+
-
-
+
+
diff --git a/Samples/Samples/ViewModel/MediaPickerViewModel.cs b/Samples/Samples/ViewModel/MediaPickerViewModel.cs
index 3d07f5154..d5a8f9208 100644
--- a/Samples/Samples/ViewModel/MediaPickerViewModel.cs
+++ b/Samples/Samples/ViewModel/MediaPickerViewModel.cs
@@ -1,5 +1,6 @@
using System;
using System.IO;
+using System.Linq;
using System.Threading.Tasks;
using System.Windows.Input;
using Xamarin.Essentials;
@@ -18,6 +19,7 @@ public class MediaPickerViewModel : BaseViewModel
public MediaPickerViewModel()
{
PickPhotoCommand = new Command(DoPickPhoto);
+ PickPhotosCommand = new Command(DoPickPhotos);
CapturePhotoCommand = new Command(DoCapturePhoto, () => MediaPicker.IsCaptureSupported);
PickVideoCommand = new Command(DoPickVideo);
@@ -26,6 +28,8 @@ public MediaPickerViewModel()
public ICommand PickPhotoCommand { get; }
+ public ICommand PickPhotosCommand { get; }
+
public ICommand CapturePhotoCommand { get; }
public ICommand PickVideoCommand { get; }
@@ -72,6 +76,23 @@ async void DoPickPhoto()
}
}
+ async void DoPickPhotos()
+ {
+ try
+ {
+ var photos = await MediaPicker.PickPhotosAsync();
+ var photo = photos.FirstOrDefault();
+
+ await LoadPhotoAsync(photo);
+
+ Console.WriteLine($"PickPhotosAsync COMPLETED: {PhotoPath}");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"PickPhotosAsync THREW: {ex.Message}");
+ }
+ }
+
async void DoCapturePhoto()
{
try
diff --git a/Xamarin.Essentials.sln b/Xamarin.Essentials.sln
index 54bdf185e..3800f5f08 100644
--- a/Xamarin.Essentials.sln
+++ b/Xamarin.Essentials.sln
@@ -19,12 +19,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tests", "Tests\Tests.csproj
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DeviceTests.Shared", "DeviceTests\DeviceTests.Shared\DeviceTests.Shared.csproj", "{D30EA5AD-6C9B-4517-9767-41C2E62946DB}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeviceTests.Android", "DeviceTests\DeviceTests.Android\DeviceTests.Android.csproj", "{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeviceTests.iOS", "DeviceTests\DeviceTests.iOS\DeviceTests.iOS.csproj", "{EE8FC716-27FC-405B-BD27-AF17E01A6671}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeviceTests.UWP", "DeviceTests\DeviceTests.UWP\DeviceTests.UWP.csproj", "{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{6330A0D0-E784-42A6-B975-451E609B907B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{EE4495FA-9869-45CF-A11D-69F2218C6F62}"
@@ -33,6 +29,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.Server.WebAuthentica
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.Mac", "Samples\Samples.Mac\Samples.Mac.csproj", "{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}"
EndProject
+Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "DeviceTests.Android", "DeviceTests\DeviceTests.Android\DeviceTests.Android.csproj", "{28060EEF-ED29-4055-BD31-EC66FD062590}"
+EndProject
+Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "DeviceTests.UWP", "DeviceTests\DeviceTests.UWP\DeviceTests.UWP.csproj", "{2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -315,48 +315,6 @@ Global
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|x64.Build.0 = Release|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|x86.ActiveCfg = Release|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|x86.Build.0 = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|ARM.ActiveCfg = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|ARM.Build.0 = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|ARM.Deploy.0 = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|ARM64.ActiveCfg = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|ARM64.Build.0 = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|ARM64.Deploy.0 = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|iPhone.Build.0 = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|iPhone.Deploy.0 = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|x64.ActiveCfg = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|x64.Build.0 = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|x64.Deploy.0 = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|x86.ActiveCfg = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|x86.Build.0 = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|x86.Deploy.0 = Debug|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|Any CPU.Build.0 = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|Any CPU.Deploy.0 = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|ARM.ActiveCfg = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|ARM.Build.0 = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|ARM.Deploy.0 = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|ARM64.ActiveCfg = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|ARM64.Build.0 = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|ARM64.Deploy.0 = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|iPhone.ActiveCfg = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|iPhone.Build.0 = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|iPhone.Deploy.0 = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|x64.ActiveCfg = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|x64.Build.0 = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|x64.Deploy.0 = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|x86.ActiveCfg = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|x86.Build.0 = Release|Any CPU
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|x86.Deploy.0 = Release|Any CPU
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|Any CPU.Deploy.0 = Debug|iPhoneSimulator
@@ -397,48 +355,6 @@ Global
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|x86.ActiveCfg = Release|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|x86.Build.0 = Release|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|x86.Deploy.0 = Release|iPhoneSimulator
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|Any CPU.ActiveCfg = Debug|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|Any CPU.Build.0 = Debug|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|Any CPU.Deploy.0 = Debug|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|ARM.ActiveCfg = Debug|ARM
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|ARM.Build.0 = Debug|ARM
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|ARM.Deploy.0 = Debug|ARM
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|ARM64.Build.0 = Debug|ARM64
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|ARM64.Deploy.0 = Debug|ARM64
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|iPhone.ActiveCfg = Debug|ARM
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|iPhone.Build.0 = Debug|ARM
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|iPhone.Deploy.0 = Debug|ARM
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|iPhoneSimulator.Build.0 = Debug|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|iPhoneSimulator.Deploy.0 = Debug|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|x64.ActiveCfg = Debug|x64
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|x64.Build.0 = Debug|x64
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|x64.Deploy.0 = Debug|x64
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|x86.ActiveCfg = Debug|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|x86.Build.0 = Debug|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|x86.Deploy.0 = Debug|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|Any CPU.ActiveCfg = Release|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|Any CPU.Build.0 = Release|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|Any CPU.Deploy.0 = Release|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|ARM.ActiveCfg = Release|ARM
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|ARM.Build.0 = Release|ARM
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|ARM.Deploy.0 = Release|ARM
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|ARM64.ActiveCfg = Release|ARM64
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|ARM64.Build.0 = Release|ARM64
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|ARM64.Deploy.0 = Release|ARM64
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|iPhone.ActiveCfg = Release|ARM
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|iPhone.Build.0 = Release|ARM
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|iPhone.Deploy.0 = Release|ARM
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|iPhoneSimulator.ActiveCfg = Release|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|iPhoneSimulator.Build.0 = Release|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|iPhoneSimulator.Deploy.0 = Release|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|x64.ActiveCfg = Release|x64
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|x64.Build.0 = Release|x64
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|x64.Deploy.0 = Release|x64
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|x86.ActiveCfg = Release|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|x86.Build.0 = Release|x86
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|x86.Deploy.0 = Release|x86
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|Any CPU.Build.0 = Debug|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|ARM.ActiveCfg = Debug|Any CPU
@@ -495,6 +411,90 @@ Global
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|x64.Build.0 = Release|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|x86.ActiveCfg = Release|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|x86.Build.0 = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|ARM.Build.0 = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|ARM.Deploy.0 = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|ARM64.Deploy.0 = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|iPhone.Deploy.0 = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|x64.Build.0 = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|x64.Deploy.0 = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|x86.Build.0 = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Debug|x86.Deploy.0 = Debug|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|Any CPU.Build.0 = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|ARM.ActiveCfg = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|ARM.Build.0 = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|ARM.Deploy.0 = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|ARM64.Build.0 = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|ARM64.Deploy.0 = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|iPhone.Build.0 = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|iPhone.Deploy.0 = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|x64.ActiveCfg = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|x64.Build.0 = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|x64.Deploy.0 = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|x86.ActiveCfg = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|x86.Build.0 = Release|Any CPU
+ {28060EEF-ED29-4055-BD31-EC66FD062590}.Release|x86.Deploy.0 = Release|Any CPU
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|Any CPU.Build.0 = Debug|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|Any CPU.Deploy.0 = Debug|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|ARM.ActiveCfg = Debug|ARM
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|ARM.Build.0 = Debug|ARM
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|ARM.Deploy.0 = Debug|ARM
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|ARM64.Build.0 = Debug|ARM64
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|ARM64.Deploy.0 = Debug|ARM64
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|iPhone.ActiveCfg = Debug|ARM
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|iPhone.Build.0 = Debug|ARM
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|iPhone.Deploy.0 = Debug|ARM
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|iPhoneSimulator.Build.0 = Debug|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|iPhoneSimulator.Deploy.0 = Debug|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|x64.ActiveCfg = Debug|x64
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|x64.Build.0 = Debug|x64
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|x64.Deploy.0 = Debug|x64
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|x86.ActiveCfg = Debug|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|x86.Build.0 = Debug|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Debug|x86.Deploy.0 = Debug|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|Any CPU.ActiveCfg = Release|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|Any CPU.Build.0 = Release|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|Any CPU.Deploy.0 = Release|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|ARM.ActiveCfg = Release|ARM
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|ARM.Build.0 = Release|ARM
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|ARM.Deploy.0 = Release|ARM
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|ARM64.ActiveCfg = Release|ARM64
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|ARM64.Build.0 = Release|ARM64
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|ARM64.Deploy.0 = Release|ARM64
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|iPhone.ActiveCfg = Release|ARM
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|iPhone.Build.0 = Release|ARM
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|iPhone.Deploy.0 = Release|ARM
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|iPhoneSimulator.ActiveCfg = Release|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|iPhoneSimulator.Build.0 = Release|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|iPhoneSimulator.Deploy.0 = Release|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|x64.ActiveCfg = Release|x64
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|x64.Build.0 = Release|x64
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|x64.Deploy.0 = Release|x64
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|x86.ActiveCfg = Release|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|x86.Build.0 = Release|x86
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9}.Release|x86.Deploy.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -507,11 +507,11 @@ Global
{5A1D97F2-6703-4278-BBF2-12C065F7E94A} = {6330A0D0-E784-42A6-B975-451E609B907B}
{2CE6F352-F61F-452F-9098-7800B3B06EEF} = {EE4495FA-9869-45CF-A11D-69F2218C6F62}
{D30EA5AD-6C9B-4517-9767-41C2E62946DB} = {EE4495FA-9869-45CF-A11D-69F2218C6F62}
- {CB2072E0-A437-4811-AE17-16CAE0DDA1B1} = {EE4495FA-9869-45CF-A11D-69F2218C6F62}
{EE8FC716-27FC-405B-BD27-AF17E01A6671} = {EE4495FA-9869-45CF-A11D-69F2218C6F62}
- {4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B} = {EE4495FA-9869-45CF-A11D-69F2218C6F62}
{553D51A8-8E79-40D9-9FB3-9FC2386FF886} = {6330A0D0-E784-42A6-B975-451E609B907B}
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5} = {6330A0D0-E784-42A6-B975-451E609B907B}
+ {28060EEF-ED29-4055-BD31-EC66FD062590} = {EE4495FA-9869-45CF-A11D-69F2218C6F62}
+ {2FE33EC9-56DD-4F8B-B85D-028EA47B0FB9} = {EE4495FA-9869-45CF-A11D-69F2218C6F62}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {E012047E-6826-4037-8D1A-5606CD7D345D}
diff --git a/Xamarin.Essentials/FileSystem/FileSystem.ios.cs b/Xamarin.Essentials/FileSystem/FileSystem.ios.cs
index 873b88ead..0a9f0cda5 100644
--- a/Xamarin.Essentials/FileSystem/FileSystem.ios.cs
+++ b/Xamarin.Essentials/FileSystem/FileSystem.ios.cs
@@ -171,11 +171,27 @@ internal UIDocumentFileResult(NSUrl url)
internal override Task PlatformOpenReadAsync()
{
Stream fileStream = File.OpenRead(FullPath);
-
return Task.FromResult(fileStream);
}
}
+ class NSUrlFileResult : FileResult
+ {
+ NSData data;
+
+ internal NSUrlFileResult(NSUrl url)
+ {
+ data = NSData.FromUrl(url);
+ FullPath = url.AbsoluteString;
+ FileName = Path.GetFileName(FullPath);
+ }
+
+ internal override Task PlatformOpenReadAsync()
+ {
+ return Task.FromResult(data.AsStream());
+ }
+ }
+
class UIImageFileResult : FileResult
{
readonly UIImage uiImage;
diff --git a/Xamarin.Essentials/MediaPicker/MediaPicker.android.cs b/Xamarin.Essentials/MediaPicker/MediaPicker.android.cs
index 2c4a22dfd..f2399be88 100644
--- a/Xamarin.Essentials/MediaPicker/MediaPicker.android.cs
+++ b/Xamarin.Essentials/MediaPicker/MediaPicker.android.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
using System.Threading.Tasks;
using Android.Content;
using Android.Content.PM;
@@ -15,6 +16,9 @@ static bool PlatformIsCaptureSupported
static Task PlatformPickPhotoAsync(MediaPickerOptions options)
=> PlatformPickAsync(options, true);
+ static Task> PlatformPickPhotosAsync(MediaPickerOptions options, MultiPickerOptions pickerOptions = null)
+ => PlatformPicksAsync(options, pickerOptions);
+
static Task PlatformPickVideoAsync(MediaPickerOptions options)
=> PlatformPickAsync(options, false);
@@ -105,5 +109,8 @@ void OnCreate(Intent intent)
return null;
}
}
+
+ static async Task> PlatformPicksAsync(MediaPickerOptions options, MultiPickerOptions pickerOptions)
+ => await Task.FromResult(new List());
}
}
diff --git a/Xamarin.Essentials/MediaPicker/MediaPicker.ios.cs b/Xamarin.Essentials/MediaPicker/MediaPicker.ios.cs
index c67d37fd7..059d7811d 100644
--- a/Xamarin.Essentials/MediaPicker/MediaPicker.ios.cs
+++ b/Xamarin.Essentials/MediaPicker/MediaPicker.ios.cs
@@ -1,9 +1,12 @@
using System;
+using System.Collections.Generic;
+using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Foundation;
using MobileCoreServices;
using Photos;
+using PhotosUI;
using UIKit;
namespace Xamarin.Essentials
@@ -18,6 +21,9 @@ static bool PlatformIsCaptureSupported
static Task PlatformPickPhotoAsync(MediaPickerOptions options)
=> PhotoAsync(options, true, true);
+ static Task> PlatformPickPhotosAsync(MediaPickerOptions options, MultiPickerOptions pickerOptions)
+ => PhotosAsync(options, pickerOptions);
+
static Task PlatformCapturePhotoAsync(MediaPickerOptions options)
=> PhotoAsync(options, true, false);
@@ -27,7 +33,7 @@ static Task PlatformPickVideoAsync(MediaPickerOptions options)
static Task PlatformCaptureVideoAsync(MediaPickerOptions options)
=> PhotoAsync(options, false, false);
- static async Task PhotoAsync(MediaPickerOptions options, bool photo, bool pickExisting)
+ static async Task PhotoAsync(MediaPickerOptions options, bool photo, bool pickExisting, bool multi = false)
{
var sourceType = pickExisting ? UIImagePickerControllerSourceType.PhotoLibrary : UIImagePickerControllerSourceType.Camera;
var mediaType = photo ? UTType.Image : UTType.Movie;
@@ -53,6 +59,7 @@ static async Task PhotoAsync(MediaPickerOptions options, bool photo,
picker.SourceType = sourceType;
picker.MediaTypes = new string[] { mediaType };
picker.AllowsEditing = false;
+
if (!photo && !pickExisting)
picker.CameraCaptureMode = UIImagePickerControllerCameraCaptureMode.Video;
@@ -92,7 +99,7 @@ static void GetFileResult(NSDictionary info, TaskCompletionSource tc
{
try
{
- tcs.TrySetResult(DictionaryToMediaFile(info));
+ tcs.TrySetResult(DictionaryToFileResult(info));
}
catch (Exception ex)
{
@@ -100,7 +107,7 @@ static void GetFileResult(NSDictionary info, TaskCompletionSource tc
}
}
- static FileResult DictionaryToMediaFile(NSDictionary info)
+ static FileResult DictionaryToFileResult(NSDictionary info)
{
if (info == null)
return null;
@@ -172,5 +179,75 @@ class PhotoPickerPresentationControllerDelegate : UIAdaptivePresentationControll
public override void DidDismiss(UIPresentationController presentationController) =>
CompletedHandler?.Invoke(null);
}
+
+ static async Task> PhotosAsync(MediaPickerOptions options, MultiPickerOptions pickerOptions)
+ {
+ var config = new PHPickerConfiguration
+ {
+ SelectionLimit = 3,
+ Filter = PHPickerFilter.ImagesFilter
+ };
+
+ var picker = new PHPickerViewController(config);
+
+ if (!string.IsNullOrWhiteSpace(options?.Title))
+ picker.Title = options.Title;
+
+ var tcs = new TaskCompletionSource>(picker);
+
+ picker.Delegate = new PhotosPickerDelegate()
+ {
+ CompletedHandler = results => GetFileResults(results, tcs)
+ };
+
+ var vc = Platform.GetCurrentViewController(true);
+
+ await vc.PresentViewControllerAsync(picker, true);
+
+ var result = await tcs.Task;
+
+ await vc.DismissViewControllerAsync(true);
+
+ picker?.Dispose();
+ picker = null;
+
+ return result;
+ }
+
+ static void GetFileResults(PHPickerResult[] results, TaskCompletionSource> tcs)
+ {
+ try
+ {
+ var fileResults = new List();
+ foreach (var result in results)
+ {
+ foreach (var registeredItemType in result.ItemProvider.RegisteredTypeIdentifiers)
+ {
+ result.ItemProvider.LoadFileRepresentation(registeredItemType, (url, error) =>
+ {
+ if (error != null || url == null)
+ return;
+
+ FileResult fileResult = new NSUrlFileResult(url);
+ var taskCompletionSource = new TaskCompletionSource();
+ taskCompletionSource.SetResult(fileResult);
+ fileResults.Add(taskCompletionSource.Task.Result);
+ });
+ }
+ }
+ tcs.TrySetResult(fileResults);
+ }
+ catch (Exception ex)
+ {
+ tcs.TrySetException(ex);
+ }
+ }
+
+ class PhotosPickerDelegate : PHPickerViewControllerDelegate
+ {
+ public Action CompletedHandler { get; set; }
+
+ public override void DidFinishPicking(PHPickerViewController picker, PHPickerResult[] results) => CompletedHandler?.Invoke(results);
+ }
}
}
diff --git a/Xamarin.Essentials/MediaPicker/MediaPicker.macos.cs b/Xamarin.Essentials/MediaPicker/MediaPicker.macos.cs
index c3ea462c8..bb1bbe481 100644
--- a/Xamarin.Essentials/MediaPicker/MediaPicker.macos.cs
+++ b/Xamarin.Essentials/MediaPicker/MediaPicker.macos.cs
@@ -13,9 +13,12 @@ static bool PlatformIsCaptureSupported
static async Task PlatformPickPhotoAsync(MediaPickerOptions options)
=> new FileResult(await FilePicker.PickAsync(new PickOptions
{
- FileTypes = FilePickerFileType.Images
+ FileTypes = FilePickerFileType.Images
}));
+ static async Task> PlatformPickPhotosAsync(MediaPickerOptions options, MultiPickerOptions pickerOptions = null)
+ => await Task.FromResult(new List());
+
static Task PlatformCapturePhotoAsync(MediaPickerOptions options)
=> PlatformPickPhotoAsync(options);
diff --git a/Xamarin.Essentials/MediaPicker/MediaPicker.netstandard.watchos.tvos.cs b/Xamarin.Essentials/MediaPicker/MediaPicker.netstandard.watchos.tvos.cs
index 2e8f85dca..d22b7c224 100644
--- a/Xamarin.Essentials/MediaPicker/MediaPicker.netstandard.watchos.tvos.cs
+++ b/Xamarin.Essentials/MediaPicker/MediaPicker.netstandard.watchos.tvos.cs
@@ -1,5 +1,4 @@
-using System;
-using System.IO;
+using System.Collections.Generic;
using System.Threading.Tasks;
namespace Xamarin.Essentials
@@ -12,6 +11,9 @@ public static partial class MediaPicker
static Task PlatformPickPhotoAsync(MediaPickerOptions options) =>
throw new NotImplementedInReferenceAssemblyException();
+ static Task> PlatformPickPhotosAsync(MediaPickerOptions options, MultiPickerOptions pickerOptions) =>
+ throw new NotImplementedInReferenceAssemblyException();
+
static Task PlatformCapturePhotoAsync(MediaPickerOptions options) =>
throw new NotImplementedInReferenceAssemblyException();
diff --git a/Xamarin.Essentials/MediaPicker/MediaPicker.shared.cs b/Xamarin.Essentials/MediaPicker/MediaPicker.shared.cs
index b6565fc96..ecc26bfb5 100644
--- a/Xamarin.Essentials/MediaPicker/MediaPicker.shared.cs
+++ b/Xamarin.Essentials/MediaPicker/MediaPicker.shared.cs
@@ -1,5 +1,4 @@
-using System;
-using System.IO;
+using System.Collections.Generic;
using System.Threading.Tasks;
namespace Xamarin.Essentials
@@ -12,6 +11,9 @@ public static bool IsCaptureSupported
public static Task PickPhotoAsync(MediaPickerOptions options = null) =>
PlatformPickPhotoAsync(options);
+ public static Task> PickPhotosAsync(MediaPickerOptions options = null, MultiPickerOptions pickerOptions = null) =>
+ PlatformPickPhotosAsync(options, pickerOptions);
+
public static Task CapturePhotoAsync(MediaPickerOptions options = null)
{
if (!IsCaptureSupported)
@@ -36,4 +38,8 @@ public class MediaPickerOptions
{
public string Title { get; set; }
}
+
+ public class MultiPickerOptions
+ {
+ }
}
diff --git a/Xamarin.Essentials/MediaPicker/MediaPicker.tizen.cs b/Xamarin.Essentials/MediaPicker/MediaPicker.tizen.cs
index a89189a75..50b4d00a7 100644
--- a/Xamarin.Essentials/MediaPicker/MediaPicker.tizen.cs
+++ b/Xamarin.Essentials/MediaPicker/MediaPicker.tizen.cs
@@ -19,6 +19,9 @@ static async Task PlatformPickPhotoAsync(MediaPickerOptions options)
FileTypes = FilePickerFileType.Images
});
+ static async Task> PlatformPickPhotosAsync(MediaPickerOptions options, MultiPickerOptions pickerOptions = null)
+ => await Task.FromResult(new List());
+
static Task PlatformCapturePhotoAsync(MediaPickerOptions options)
=> PlatformMediaAsync(options, true);
diff --git a/Xamarin.Essentials/MediaPicker/MediaPicker.uwp.cs b/Xamarin.Essentials/MediaPicker/MediaPicker.uwp.cs
index a7dc9e8a7..fe1887ba5 100644
--- a/Xamarin.Essentials/MediaPicker/MediaPicker.uwp.cs
+++ b/Xamarin.Essentials/MediaPicker/MediaPicker.uwp.cs
@@ -3,6 +3,7 @@
using System.Threading.Tasks;
using Windows.Media.Capture;
using Windows.Storage.Pickers;
+using System.Collections.Generic;
namespace Xamarin.Essentials
{
@@ -14,6 +15,9 @@ static bool PlatformIsCaptureSupported
static Task PlatformPickPhotoAsync(MediaPickerOptions options)
=> PickAsync(options, true);
+ static async Task> PlatformPickPhotosAsync(MediaPickerOptions options, MultiPickerOptions pickerOptions = null)
+ => await Task.FromResult(new List());
+
static Task PlatformPickVideoAsync(MediaPickerOptions options)
=> PickAsync(options, false);