partial void RemoveAsset(NSObject sender) { Action <bool, NSError> completion = (success, error) => { if (success) { PHPhotoLibrary.SharedPhotoLibrary.UnregisterChangeObserver(this); DispatchQueue.MainQueue.DispatchSync(() => NavigationController.PopViewController(true)); } else { Console.WriteLine($"can't remove asset: {error.LocalizedDescription}"); } }; if (AssetCollection != null) { // Remove asset from album PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() => { var request = PHAssetCollectionChangeRequest.ChangeRequest(AssetCollection); request.RemoveAssets(new PHObject [] { Asset }); }, completion); } else { // Delete asset from library PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() => PHAssetChangeRequest.DeleteAssets(new [] { Asset }), completion); } }
public static bool SaveImageToGalery(string imagePath, string albumName) { var saved = true; PHAssetCollection customAlbum = null; if (!string.IsNullOrEmpty(albumName)) { customAlbum = FindOrCreateAlbum(albumName); if (customAlbum == null) { return(false); } } PHPhotoLibrary.SharedPhotoLibrary.PerformChanges( () => { var assetRequest = PHAssetChangeRequest.FromImage(NSUrl.FromFilename(imagePath)); if (customAlbum != null) { var albumRequest = PHAssetCollectionChangeRequest.ChangeRequest(customAlbum); albumRequest?.AddAssets(new[] { assetRequest.PlaceholderForCreatedAsset }); } }, (success, error) => { if (!success) { Console.WriteLine(error); saved = success; } } ); return(saved); }
partial void AddAsset(NSObject sender) { var rnd = new Random(); // Create a random dummy image. var size = (rnd.Next(0, 2) == 0) ? new CGSize(400f, 300f) : new CGSize(300f, 400f); var renderer = new UIGraphicsImageRenderer(size); var image = renderer.CreateImage(context => { UIColor.FromHSBA((float)rnd.NextDouble(), 1, 1, 1).SetFill(); context.FillRect(context.Format.Bounds); }); // Add it to the photo library PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() => { PHAssetChangeRequest creationRequest = PHAssetChangeRequest.FromImage(image); if (AssetCollection != null) { var addAssetRequest = PHAssetCollectionChangeRequest.ChangeRequest(AssetCollection); addAssetRequest.AddAssets(new PHObject [] { creationRequest.PlaceholderForCreatedAsset }); } }, (success, error) => { if (!success) { Console.WriteLine(error.LocalizedDescription); } }); }
private static PHAssetCollection FindOrCreateAlbum(string albumName) { var albums = PHAssetCollection.FetchAssetCollections(PHAssetCollectionType.Album, PHAssetCollectionSubtype.AlbumRegular, null); var customAlbum = (PHAssetCollection)albums.FirstOrDefault(s => ((PHAssetCollection)s).LocalizedTitle.Equals(albumName)); if (customAlbum == null) { var success = PHPhotoLibrary.SharedPhotoLibrary.PerformChangesAndWait( () => { PHAssetCollectionChangeRequest.CreateAssetCollection(albumName); }, out var error ); if (success) { albums = PHAssetCollection.FetchAssetCollections(PHAssetCollectionType.Album, PHAssetCollectionSubtype.AlbumRegular, null); customAlbum = (PHAssetCollection)albums.FirstOrDefault(s => ((PHAssetCollection)s).LocalizedTitle.Equals(albumName)); } else { Console.WriteLine(error); customAlbum = null; } } return(customAlbum); }
void SaveToAlbum(string watermarkedPath) { var lib = PHPhotoLibrary.SharedPhotoLibrary; lib.PerformChanges(() => { var album = PHAssetCollection.FetchAssetCollections(new[] { Xamarin.Essentials.Preferences.Get("iOSAlbumIdentifier", string.Empty) }, null)?.firstObject as PHAssetCollection; var collectionRequest = PHAssetCollectionChangeRequest.ChangeRequest(album); if (UIDevice.CurrentDevice.CheckSystemVersion(9, 0)) { var options = new PHAssetResourceCreationOptions { ShouldMoveFile = true }; var changeRequest = PHAssetCreationRequest.CreationRequestForAsset(); changeRequest.AddResource(PHAssetResourceType.Video, NSUrl.FromString(watermarkedPath), options); collectionRequest.AddAssets(new[] { changeRequest.PlaceholderForCreatedAsset }); } else { var changeRequest2 = PHAssetChangeRequest.FromVideo(NSUrl.FromString(watermarkedPath)); collectionRequest.AddAssets(new[] { changeRequest2.PlaceholderForCreatedAsset }); } RetrieveLastAssetSaved(); }, (success, err) => { }); }
void AddAlbum(object sender, EventArgs args) { var alertController = UIAlertController.Create("New Album", null, UIAlertControllerStyle.Alert); alertController.AddTextField(textField => { textField.Placeholder = "Album Name"; }); alertController.AddAction(UIAlertAction.Create("Create", UIAlertActionStyle.Default, action => { var textField = alertController.TextFields[0]; var title = textField.Text; if (!string.IsNullOrEmpty(title)) { // Create a new album with the title entered. PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() => { PHAssetCollectionChangeRequest.CreateAssetCollection(title); }, (success, error) => { if (!success) { Console.WriteLine($"error creating album: {error}"); } }); } })); PresentViewController(alertController, true, null); }
partial void AddButtonClickHandler(NSObject sender) { // Prompt user from new album title. var alertController = UIAlertController.Create("New Album", null, UIAlertControllerStyle.Alert); alertController.AddTextField(textField => { textField.Placeholder = "Album Name"; }); alertController.AddAction(UIAlertAction.Create("Cancel", UIAlertActionStyle.Cancel, null)); alertController.AddAction(UIAlertAction.Create("Create", UIAlertActionStyle.Default, action => { UITextField textField = alertController.TextFields.First(); string title = textField.Text; if (string.IsNullOrEmpty(title)) { return; } // Create a new album with the title entered. PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() => PHAssetCollectionChangeRequest.CreateAssetCollection(title), (success, error) => { if (!success) { Console.WriteLine(error.LocalizedDescription); } }); })); PresentViewController(alertController, true, null); }
void SetupAlbum() { var album = PHAssetCollection.FetchAssetCollections(new[] { Xamarin.Essentials.Preferences.Get("iOSAlbumIdentifier", string.Empty).ToString() }, null)?.firstObject as PHAssetCollection; if (album == null) { var albums = PHAssetCollection.FetchAssetCollections(PHAssetCollectionType.Album, PHAssetCollectionSubtype.Any, new PHFetchOptions { IncludeAssetSourceTypes = PHAssetSourceType.UserLibrary }); if (albums.Count > 0) { foreach (var a in albums) { var collection = (a as PHAssetCollection); if (collection.LocalizedTitle.Equals("ConferenceVision")) { SaveIdentifier(collection.LocalIdentifier); return; } } } PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() => { var req = PHAssetCollectionChangeRequest.CreateAssetCollection("ConferenceVision"); albumIdentifier = req.PlaceholderForCreatedAssetCollection.LocalIdentifier; SaveIdentifier(albumIdentifier); }, (success, error) => { Debug.Write("Create Album " + success); }); } }
partial void TrashButtonClickHandler(NSObject sender) { Action <bool, NSError> completionHandler = (success, error) => { if (success) { DispatchQueue.MainQueue.DispatchAsync(() => NavigationController.PopViewController(true) ); } else { Console.WriteLine(error.LocalizedDescription); } }; if (AssetCollection != null) { // Remove asset from album PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() => { var changeRequest = PHAssetCollectionChangeRequest.ChangeRequest(AssetCollection); changeRequest.RemoveAssets(new PHObject[] { Asset }); }, completionHandler); } else { // Delete asset from library PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() => PHAssetChangeRequest.DeleteAssets(new [] { Asset }), completionHandler); } }
partial void AddButtonClickHandler(NSObject sender) { // Create a random dummy image. var rect = new Random().Next(0, 2) == 0 ? new CGRect(0f, 0f, 400f, 300f) : new CGRect(0f, 0f, 300f, 400f); UIGraphics.BeginImageContextWithOptions(rect.Size, false, 1f); UIColor.FromHSBA(new Random().Next(0, 100) / 100f, 1f, 1f, 1f).SetFill(); UIGraphics.RectFillUsingBlendMode(rect, CGBlendMode.Normal); UIImage image = UIGraphics.GetImageFromCurrentImageContext(); UIGraphics.EndImageContext(); // Add it to the photo library PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() => { PHAssetChangeRequest assetChangeRequest = PHAssetChangeRequest.FromImage(image); if (AssetCollection != null) { PHAssetCollectionChangeRequest assetCollectionChangeRequest = PHAssetCollectionChangeRequest.ChangeRequest(AssetCollection); assetCollectionChangeRequest.AddAssets(new PHObject[] { assetChangeRequest.PlaceholderForCreatedAsset }); } }, (success, error) => { if (!success) { Console.WriteLine(error.LocalizedDescription); } }); }
public static bool SaveVideoToGalery(NSUrl video, string path, string albumName) { var saved = true; var compatible = UIVideo.IsCompatibleWithSavedPhotosAlbum(path); var customAlbum = string.IsNullOrEmpty(albumName) ? null : FindOrCreateAlbum(albumName); if (!compatible) { return(false); } UIVideo.SaveToPhotosAlbum(path, (path, error) => { if (error != null) { saved = false; Console.WriteLine(error); } else if (customAlbum != null) { var savedAsset = (PHAsset)PHAsset.FetchAssets(PHAssetMediaType.Video, new PHFetchOptions { SortDescriptors = new[] { new NSSortDescriptor("creationDate", false) }, FetchLimit = 1 }).FirstOrDefault(); if (savedAsset != null) { PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() => { var albumRequest = PHAssetCollectionChangeRequest.ChangeRequest(customAlbum); albumRequest?.AddAssets(new[] { savedAsset }); }, (success, error) => { if (!success) { Console.WriteLine(error); saved = success; } } ); } } }); return(saved); }
public static async Task <bool> SaveToLibrary(string path, string albumName) { var source = new TaskCompletionSource <bool>(); PHAssetCollection album = await GetAlbum(albumName); PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() => { var assetReq = PHAssetChangeRequest.FromImage(NSUrl.CreateFileUrl(path, null)); var albumReq = PHAssetCollectionChangeRequest.ChangeRequest(album); var placeholder = assetReq.PlaceholderForCreatedAsset; albumReq.AddAssets(new[] { (PHObject)placeholder }); }, (success, err) => { Debug.WriteLine($"SaveToLibrary: {success}"); source.SetResult(success); }); return(await source.Task); }
public Task <IMediaAlbum> CreateAlbum(string title) { return(Task.Run(() => { IMediaAlbum album = null; string id = null; if (PHPhotoLibrary.SharedPhotoLibrary.PerformChangesAndWait(() => { var request = PHAssetCollectionChangeRequest.CreateAssetCollection(title); id = request.PlaceholderForCreatedAssetCollection.LocalIdentifier; }, out var error)) { var col = (PHAssetCollection)PHAssetCollection.FetchAssetCollections(new[] { id }, null).First(); album = new MediaAlbum(col); } return album; })); }
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); }
public async Task <string> ImageSave(MemoryStream stream, bool compatibleMode, string fileName = null) { NSError error = null; //虽然对于iOS没有这两个权限,但要保证方法异步,所以还是保留下来了 await Permissions.RequestAsync <Permissions.StorageWrite>(); await Permissions.RequestAsync <Permissions.StorageRead>(); //判断相册是否存在,不存在就创建 PHAssetCollection appAlbum = null; PHFetchResult albums = PHAssetCollection.FetchAssetCollections(PHAssetCollectionType.Album, PHAssetCollectionSubtype.Any, null); foreach (PHAssetCollection album in albums) { if (album.LocalizedTitle == albumName) { appAlbum = album; } } if (appAlbum == null) //相册不存在,新建 { string[] albumID = new string[1]; PHPhotoLibrary.SharedPhotoLibrary.PerformChangesAndWait(() => { albumID[0] = PHAssetCollectionChangeRequest.CreateAssetCollection(albumName).PlaceholderForCreatedAssetCollection.LocalIdentifier; }, out error); appAlbum = PHAssetCollection.FetchAssetCollections(albumID, null)[0] as PHAssetCollection; } //获取路径及名称 string documentsPath; documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); if (fileName == null || fileName == "") { fileName = "Tank_" + DateTime.Now.ToLocalTime().ToString("yyyyMMdd_HHmmss") + ".png"; } string path = Path.Combine(documentsPath, fileName); //保存 FileStream photoTankFile = new FileStream(path, FileMode.Create); byte[] photoTank = stream.ToArray(); photoTankFile.Write(photoTank, 0, photoTank.Length); photoTankFile.Flush(); photoTankFile.Close(); //如果是图片或视频,就添加到相册里 string MimeType = MimeUtility.GetMimeMapping(path); if (MimeType.IndexOf("image") != -1 || MimeType.IndexOf("video") != -1) { string[] assetID = new string[1]; PHPhotoLibrary.SharedPhotoLibrary.PerformChangesAndWait(() => { if (MimeType.IndexOf("image") != -1) { assetID[0] = PHAssetChangeRequest.FromImage(new NSUrl(path, true)).PlaceholderForCreatedAsset.LocalIdentifier; } if (MimeType.IndexOf("video") != -1) { assetID[0] = PHAssetChangeRequest.FromVideo(new NSUrl(path, true)).PlaceholderForCreatedAsset.LocalIdentifier; } }, out error); PHAsset asset = PHAsset.FetchAssetsUsingLocalIdentifiers(assetID, null)[0] as PHAsset; PHObject[] objs = { asset }; PHPhotoLibrary.SharedPhotoLibrary.PerformChangesAndWait(() => { PHAssetCollectionChangeRequest collectionChangeRequest = PHAssetCollectionChangeRequest.ChangeRequest(appAlbum); collectionChangeRequest.InsertAssets(objs, new NSIndexSet(0)); }, out error); } return(Path.Combine(fileName)); }