Xamarin ios - 来自UIImagePickerController的referenceUrl始终为null

时间:2016-01-12 16:16:04

标签: ios xamarin xamarin.ios

我使用UIImagePickerController从图库中选择图像。选择图像后,我想更新文本字段上的实际图像文件路径。

我可以从referenceUrl获取文件路径吗?在我的情况下,referenceUrl总是返回null。

protected void Handle_FinishedPickingMedia (object sender, UIImagePickerMediaPickedEventArgs e)
{
    try{

        //determine what was selected, video or image
        bool isImage = false;
        switch(e.Info [UIImagePickerController.MediaType].ToString()) {
        case "public.image":
            Console.WriteLine("Image selected");
            isImage = true;
            break;
        }

// get common info (shared between images and video)
            NSUrl referenceURL = e.Info[new NSString("UIImagePickerControllerReferenceUrl")] as NSUrl;
            if (referenceURL != null)

                Console.WriteLine("Url:"+referenceURL.ToString ());
// if it was an image, get the other image info
            if(isImage) {
            // get the original image
            UIImage originalImage = e.Info[UIImagePickerController.OriginalImage] as UIImage;
            if(originalImage != null) {
                // do something with the image

                new Thread(new System.Threading.ThreadStart(() => {
                    Thread.Sleep(350);

                    BeginInvokeOnMainThread (() => {

                        var tag = ((UIButton)sender).Tag;

                        //UIButton senderButton = (UIButton)sender;

                        switch(tag)
                        {
                        case 0:
// do something here

                            break;
                        case 1:

// do something here                                    
break;
});
                })).Start();
            }
        } 
        // dismiss the picker
        imagePicker.DismissModalViewController (true);
}catch(Exception ex)
        {
            ShowAlert ("Failed !", "Unable to select image", "");

        Console.WriteLine(ex.Message + ex.StackTrace);

    }
}

1 个答案:

答案 0 :(得分:3)

对于遇到此问题的其他人来说,解决方案是一个简单的错字。我打印出NSDictionary的详细信息,并注意到“Url”部分的     UIImagePickerControllerReferenceUrl全部大写。这对我有用。

更改此行:

NSUrl referenceURL = e.Info[new NSString("UIImagePickerControllerReferenceUrl")] as NSUrl;

对此:

NSUrl referenceURL = e.Info[new NSString("UIImagePickerControllerReferenceURL")] as NSUrl;

要获取所选图片文件名,我添加了AssestsLibrary并用它来提取必要的元数据。

这是我的全面实施:

protected void Handle_FinishedPickingMedia (object sender, UIImagePickerMediaPickedEventArgs e)
{
    try{

    //determine what was selected, video or image
    bool isImage = false;
    switch(e.Info [UIImagePickerController.MediaType].ToString()) {
    case "public.image":
        Console.WriteLine("Image selected");
        isImage = true;
        break;
    }

// get common info (shared between images and video)
        NSUrl referenceURL = e.Info[new NSString("UIImagePickerControllerReferenceURL")] as NSUrl;
        if (referenceURL != null)

            Console.WriteLine("Url:"+referenceURL.ToString ());

         ALAssetsLibrary assetsLibrary = new ALAssetsLibrary();
            assetsLibrary.AssetForUrl(referenceURL,delegate (ALAsset asset){

                ALAssetRepresentation representation = asset.DefaultRepresentation;

                if (representation == null)
                {
                    return;

                }else{


                    string fileName = representation.Filename;

                    Console.WriteLine("Image Filename :" + fileName);

                }


            },delegate(NSError error) {

                Console.WriteLine ("User denied access to photo Library... {0}", error);


            });

// if it was an image, get the other image info
        if(isImage) {
        // get the original image
        UIImage originalImage = e.Info[UIImagePickerController.OriginalImage] as UIImage;
        if(originalImage != null) {
            // do something with the image

            new Thread(new System.Threading.ThreadStart(() => {
                Thread.Sleep(350);

                BeginInvokeOnMainThread (() => {

                    var tag = ((UIButton)sender).Tag;

                    //UIButton senderButton = (UIButton)sender;

                    switch(tag)
                    {
                    case 0:
// do something here

                        break;
                    case 1:

// do something here                                    
                      break;
                      });
            })).Start();
        }
    } 
    // dismiss the picker
    imagePicker.DismissModalViewController (true);
  }catch(Exception ex)
    {
        ShowAlert ("Failed !", "Unable to select image", "");

    Console.WriteLine(ex.Message + ex.StackTrace);

}

}