public static Task <PHAssetCollection> CreateAlbum(string name) { var source = new TaskCompletionSource <PHAssetCollection>(); PHObjectPlaceholder placeholder = null; PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() => { var request = PHAssetCollectionChangeRequest.CreateAssetCollection(name); placeholder = request.PlaceholderForCreatedAssetCollection; }, (success, err) => { if (success) { var result = PHAssetCollection.FetchAssetCollections(new[] { placeholder.LocalIdentifier }, null); source.SetResult((PHAssetCollection)result.firstObject); } else { source.SetException(new Exception(err.ToString())); } }); return(source.Task); }
void FinishCapture(object sender, Tuple <NSObject, NSError> e) { if (Element == null || Control == null) { return; } if (e.Item2 != null) { Element.RaiseMediaCaptureFailed(e.Item2.LocalizedDescription); return; } var photoData = e.Item1 as NSData; if (!Element.SavePhotoToFile && photoData != null) { var data = UIImage.LoadFromData(photoData).AsJPEG().ToArray(); Device.BeginInvokeOnMainThread(() => { Element.RaiseMediaCaptured(new MediaCapturedEventArgs(imageData: data)); }); return; } PHObjectPlaceholder placeholder = null; PHPhotoLibrary.RequestAuthorization(status => { if (status != PHAuthorizationStatus.Authorized) { return; } // Save the captured file to the photo library. PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() => { var creationRequest = PHAssetCreationRequest.CreationRequestForAsset(); if (photoData != null) { creationRequest.AddResource(PHAssetResourceType.Photo, photoData, null); placeholder = creationRequest.PlaceholderForCreatedAsset; } else if (e.Item1 is NSUrl outputFileUrl) { creationRequest.AddResource( PHAssetResourceType.Video, outputFileUrl, new PHAssetResourceCreationOptions { ShouldMoveFile = true }); placeholder = creationRequest.PlaceholderForCreatedAsset; } }, (success2, error2) => { if (!success2) { Debug.WriteLine($"Could not save media to photo library: {error2}"); if (error2 != null) { Element.RaiseMediaCaptureFailed(error2.LocalizedDescription); return; } Element.RaiseMediaCaptureFailed($"Could not save media to photo library"); return; } if (!(PHAsset.FetchAssetsUsingLocalIdentifiers(new[] { placeholder.LocalIdentifier }, null).firstObject is PHAsset asset)) { Element.RaiseMediaCaptureFailed($"Could not save media to photo library"); return; } if (asset.MediaType == PHAssetMediaType.Image) { asset.RequestContentEditingInput(new PHContentEditingInputRequestOptions { CanHandleAdjustmentData = p => true }, (input, info) => { Device.BeginInvokeOnMainThread(() => { Element.RaiseMediaCaptured(new MediaCapturedEventArgs(input.FullSizeImageUrl.Path)); }); }); } else if (asset.MediaType == PHAssetMediaType.Video) { PHImageManager.DefaultManager.RequestAvAsset(asset, new PHVideoRequestOptions { Version = PHVideoRequestOptionsVersion.Original }, (avAsset, mix, info) => { if (!(avAsset is AVUrlAsset urlAsset)) { Element.RaiseMediaCaptureFailed($"Could not save media to photo library"); return; } Device.BeginInvokeOnMainThread(() => { Element.RaiseMediaCaptured(new MediaCapturedEventArgs(urlAsset.Url.Path)); }); }); } });