来自UIImagePickerController的Xamarin ios-引用URL始终为空

来自UIImagePickerController的Xamarin ios-引用URL始终为空,ios,xamarin,xamarin.ios,Ios,Xamarin,Xamarin.ios,我正在使用UIImagePickerController从库中选择图像。选择图像后,我想更新文本字段上的真实图像文件路径 我可以从referenceUrl获取文件路径吗?在我的例子中,referenceUrl总是返回null protected void Handle_FinishedPickingMedia (object sender, UIImagePickerMediaPickedEventArgs e) { try{ //determine what was

我正在使用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);

    }
}

对于其他任何面临这个问题的人来说,解决方案只是一个简单的打字错误。我打印了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);

}

}

对于其他任何面临此问题的人来说,解决方案只是简单的打字错误。我打印了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);

}
}