首页 > 解决方案 > IOS 14 请求限制照片访问

问题描述

我正在尝试使用 PHPickerController 并访问 PHAsset 以获取文件名和文件大小,但 PHAsset 为空

var config = new PHPickerConfiguration(PHPhotoLibrary.SharedPhotoLibrary) {
    Filter = PHPickerFilter.ImagesFilter,
    SelectionLimit = 1
};
var picker= new PHPickerViewController(config) {
    ModalPresentationStyle = UIModalPresentationStyle.Popover,
    Delegate = new ImagePickerDelegate((fileSize, fileName, url) => {

    })
};

ViewController.PresentViewController(picker, true, null);
public class ImagePickerDelegate : PHPickerViewControllerDelegate
{
    public ImagePickerDelegate(Action<int, string, string> action)
    {
        Action = action;
    }

    public Action<int, string, string> Action { get; }

    public override void DidFinishPicking(PHPickerViewController picker, PHPickerResult[] results)
    {
        picker.DismissViewController(true, null);

        foreach (var result in results)
        {
            var asset = PHAsset.FetchAssets(result.AssetIdentifier, null)?.firstObject as PHAsset;
            // The asset are null
            var fileSize = asset.ValueForKey((NSString)"fileSize");
        }
    }
}

截屏

正如您在图像中看到的那样,请求对话框显示和代码不会在下一行暂停

var 资产 = PHAsset.FetchAssets(result.AssetIdentifier, null)?.firstObject 作为 PHAsset;

并返回 null

标签: c#ios.netxamarin

解决方案


您可以使用FetchAssetsUsingLocalIdentifiers方法获取PHAsset对象,然后它将返回值。

示例代码如下:

public override void DidFinishPicking(PHPickerViewController picker, PHPickerResult[] results)
{
    picker.DismissViewController(true, null);

    foreach (var result in results)
    {
       var refID = result.AssetIdentifier;
       string[] refIDs = new string[] { refID };
       var asset = PHAsset.FetchAssetsUsingLocalIdentifiers(refIDs, null)?.firstObject as PHAsset;
       
       // var fileSize = asset.ValueForKey((NSString)"fileSize");
    }
}

也可以看看这个本机代码链接


推荐阅读