Как получить видео с PHVideo из iCloud на Xamarin iOS?

Я реализовал средство выбора мультимедиа (для изображений и видео) с DependencyService в приложении Xamarin.Forms. У меня проблема с видео из iCloud. Когда я выбираю видео, которое есть в icloud, я не могу его получить.

Моя реализация:

async void FinishedPickingAssets(object sender, MultiAssetEventArgs args)
         {
             IList<MediaFile> results = new List<MediaFile>();
             TaskCompletionSource<IList<MediaFile>> tcs = new TaskCompletionSource<IList<MediaFile>>();
    
             try 
             { 
                 var options = new PHImageRequestOptions()
                 {
                     NetworkAccessAllowed = true
                 };
    
                 options.Synchronous = false;
                 options.ResizeMode = PHImageRequestOptionsResizeMode.Fast;
                 options.DeliveryMode = PHImageRequestOptionsDeliveryMode.HighQualityFormat;
                 bool completed = false;
                 for (var i = 0; i < args.Assets.Length; i++)
                 {
                     var asset = args.Assets[i];
    
                     string fileName = string.Empty;
                     if (UIDevice.CurrentDevice.CheckSystemVersion(9, 0))
                     {
                         fileName = PHAssetResource.GetAssetResources(asset).FirstOrDefault().OriginalFilename;
                         fileName = Path.GetFileNameWithoutExtension(fileName) + "(" + i.ToString() + ")" + Path.GetExtension(fileName);
                     }
    
                     switch (asset.MediaType)
                     {
                         case PHAssetMediaType.Video:
                         {
                                 var vOptions = new PHVideoRequestOptions();
                                 vOptions.NetworkAccessAllowed = true;
                                 vOptions.Version = PHVideoRequestOptionsVersion.Original;
                                 vOptions.DeliveryMode = PHVideoRequestOptionsDeliveryMode.Automatic;
                                 string videoUrl = "";
    
                                 PHImageManager.DefaultManager.RequestAvAsset(asset, vOptions, (avAsset, audioMix, vInfo) => 
                                 {
                                     DispatchQueue.MainQueue.DispatchAsync(() => {
    
                                         var error = vInfo.ObjectForKey(PHImageKeys.Error);
                                            
                                         if (avAsset != null)
                                         {
                                             videoUrl = ((AVFoundation.AVUrlAsset)avAsset).Url.Path;
                                         }
                                         var meFile = new MediaFile()
                                         {
                                             FileName = fileName,
                                             FilePath = videoUrl
                                         };
    
                                         using (Stream source = File.OpenRead(videoUrl))
                                         {
                                             meFile.FileSize = source.Length;
                                         }
                                         results.Add(meFile);
                                         OnMediaPicked?.Invoke(this, meFile);
    
                                         if (args.Assets.Length == results.Count && !completed)
                                         {
                                             completed = true;
                                             tcs.TrySetResult(results);
                                         }
                                     });
                                 });
                         }
                         break;
                     default:
                         PHImageManager.DefaultManager.RequestImageData(asset, options, (data, dataUti, orientation, info) =>
                         {
    
                             string path = FileHelper.GetOutputPath(MediaFileType.Image, TemporalDirectoryName, fileName);
    
                             if (!File.Exists(path))
                             {
                                 Debug.WriteLine(dataUti);
                                 var imageData = data;
                                 imageData?.Save(path, true);
                             }
    
                             var meFile = new MediaFile()
                             {
                                 FileName = fileName,
                                 FilePath = path,
                                 FileSize = File.ReadAllBytes(path).Length
                             };
    
                             results.Add(meFile);
                             OnMediaPicked?.Invoke(this, meFile);
                             if (args.Assets.Length == results.Count && !completed)
                             {
                                 completed = true;
                                 tcs.TrySetResult(results);
                             }
    
                         });
                         break;
                     }
                 }
             }
             catch
             {
                 tcs.TrySetResult(results);
    
                 string automationId = "UnexpectedSituationMessage";
                 GeneralOperations.OpenToastMessage("Unexpected Situation", automationId);
             }
    
             mediaPickTcs?.TrySetResult(await tcs.Task);
         }

Когда я пытаюсь выбрать объект iCloud, я получаю следующую ошибку: введите здесь описание изображения

Как я могу снимать видео с множественным выбором из icloud?

Заранее спасибо.


person Pelin Alp    schedule 17.12.2020    source источник
comment
Ошибка 1005 означает, что вам отказано в доступе. Для этого может быть несколько причин. 1. Администратор сайта заблокировал целый ряд IP-адресов. 2. Используемая вами служба VPN заблокирована веб-сайтом. 3. Cloudflare или другая подобная служба заблокировала ваш IP-адрес за нарушение их условий или любое подозрительное поведение. Попробуйте использовать VPN или прокси-сервер, чтобы изменить свой IP-адрес или удалить/отключить службу VPN. И попробуй еще раз.   -  person Michael    schedule 17.12.2020
comment
Спасибо за ответ. Но я не уверен, что причина моей проблемы в этом. Потому что при первой попытке я получаю сообщение об ошибке, но начинается загрузка видео на телефон. после того, как вытащу видео на телефон, я смогу получить его во второй раз. Кроме того, я могу тянуть вручную с тем же IP-адресом.   -  person Pelin Alp    schedule 17.12.2020


Ответы (1)


Сначала убедитесь, что вы включили iCloud Photos.


 1. Go to Settings > [your name] > iCloud.
 2. Tap Photos.
 3. If you need to, tap to turn on iCloud Photos.

введите здесь описание изображения

Затем проверьте, отображаются ли видео и фото в приложении Photo на вашем устройстве.

Для множественного выбора и нескольких настроек вы можете установить плагин GMImagePicker.Xamarin из nuget .

person Lucas Zhang    schedule 17.12.2020
comment
Привет, я уже использую GMImagePicker. Мой общий фрагмент кода — это метод FinishedPickingAssets. Например: var picker = new GMImagePickerController (); picker.FinishedPickingAssets += FinishedPickingAssets; await PresentViewControllerAsync (picker, true); У меня возникли проблемы с получением информации о пути и размере видео в iCloud с помощью GMImagePicker. И я проверил, что iCloud Photos включены. Но я понял, что у меня возникли проблемы в первый раз, когда я получаю товар. Первый раз я получаю сообщение об ошибке, но загрузка видео начинается. - person Pelin Alp; 17.12.2020
comment
Когда я жду после получения ошибки, видео извлекается из iCloud. Вот почему второй раз я могу получить его. Но я хочу дождаться первого раза, пока не скинут видео на телефон. - person Pelin Alp; 17.12.2020
comment
Не могли бы вы поделиться образцом с github, чтобы я мог протестировать его на своей стороне? - person Lucas Zhang; 17.12.2020
comment
Это часть большого индивидуального проекта. Вот почему я не могу сейчас поделиться. Но я постараюсь сделать демонстрационный проект. Я буду делиться. Спасибо. - person Pelin Alp; 17.12.2020
comment
Хорошо, я проверю это как можно скорее после того, как вы загрузите его. - person Lucas Zhang; 17.12.2020