【问题标题】:Xamarin ios - referenceUrl from UIImagePickerController always nullXamarin ios - UIImagePickerController 中的 referenceUrl 始终为空
【发布时间】:2016-01-13 04:59:55
【问题描述】:

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

    }
}

【问题讨论】:

    标签: ios xamarin xamarin.ios


    【解决方案1】:

    对于遇到此问题的其他人,解决方案是一个简单的错字。我打印了 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);
    
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多