Xamarin ios - 来自 UIImagePickerController 的 referenceUrl 始终为空 [英] Xamarin ios - referenceUrl from UIImagePickerController always null

查看:24
本文介绍了Xamarin ios - 来自 UIImagePickerController 的 referenceUrl 始终为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 UIImagePickerController 从图库中选择一个图像.选择图像后,我想更新文本字段上的真实图像文件路径.

I'm selecting an image form the gallery using the UIImagePickerController. After selecting an image, I would like to update the real image file path on a text field.

我可以从 referenceUrl 获取文件路径吗?在我的例子中,referenceUrl 总是返回 null.

Can I get the file path from the referenceUrl? The referenceUrl in my case always returns 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);

    }
}

推荐答案

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

For anyone else facing this issue, the solution was a simple typo.I printed out the details of the NSDictionary and noticed that the "Url" part of the UIImagePickerControllerReferenceUrl was all caps. This is what worked for me.

更改这一行:

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

为此:

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

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

To get the filename of the selected image, I added the AssestsLibrary and used that to extract the necessary metadata.

这是我的完整实现:​​

Here's my full implementation:

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);

}

}

这篇关于Xamarin ios - 来自 UIImagePickerController 的 referenceUrl 始终为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆