Я реализовал средство выбора мультимедиа (для изображений и видео) с 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?
Заранее спасибо.