static Task <FileInfo[]> TakeMedia(string type, string action, bool enableMultipleSelection, Device.MediaCaptureSettings options) { var id = NextRequestId++; var completionSource = new TaskCompletionSource <FileInfo[]>(id); UIRuntime.CurrentActivity.StartActivity(CreateIntent(id, type, action, enableMultipleSelection, options)); void OnMediaPicked(MediaPickedEventArgs e) { GC.Collect(); PickerActivity.Picked.RemoveHandler(OnMediaPicked); if (e.RequestId != id) { return; } if (e.Media.Any(x => !x.Exists())) { completionSource.TrySetResult(null); } else if (e.Error != null) { completionSource.SetException(e.Error); } else { completionSource.TrySetResult(e.Media); } } PickerActivity.Picked.Handle(OnMediaPicked); GC.Collect(); return(completionSource.Task); }
static Intent CreateIntent(int id, string type, string action, bool enableMultipleSelection, Device.MediaCaptureSettings settings) { var result = new Intent(UIRuntime.CurrentActivity, typeof(PickerActivity)) .PutExtra("id", id) .PutExtra("type", type) .PutExtra("action", action) .PutExtra(Intent.ExtraAllowMultiple, enableMultipleSelection) .PutExtra("purge-camera-roll", settings.PurgeCameraRoll) .SetFlags(ActivityFlags.NewTask); if (settings.Camera == CameraOption.Front) { result.PutExtra("android.intent.extras.CAMERA_FACING", 1); } if (action == MediaStore.ActionVideoCapture) { if (settings.VideoMaxDuration.HasValue) { result.PutExtra(MediaStore.ExtraDurationLimit, (int)settings.VideoMaxDuration.Value.TotalSeconds); } if (settings.VideoQuality == VideoQuality.Low) { result.PutExtra(MediaStore.ExtraVideoQuality, 0); } else { result.PutExtra(MediaStore.ExtraVideoQuality, 1); } } return(result); }