来自UIImagePickerController的Xamarin ios – referenceUrl总是为空

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

我可以从referenceUrl获取文件path吗? 在我的情况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); } } 

对于任何其他面临这个问题的解决scheme是一个简单的错字。我打印出NSDictionary的细节,并注意到UIImagePickerControllerReferenceUrl的“Url”部分是全部大写。 这是为我工作。

改变这一行:

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

}