Пример #1
0
        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));
                            });
                        });
                    }
                });