【问题标题】:Get Path of Gallery Image Xamarin?获取画廊图像 Xamarin 的路径?
【发布时间】:2017-08-15 12:05:56
【问题描述】:

我正在尝试获取 Gallery Image 的路径。我正在获取存储在内部存储中而不是外部存储中的图像的路径。我还启用了已授予的读写存储和相机访问权限。 这是我的代码

    void ChoosePhoto()
    {
        try
        {
            var imageIntent = new Intent();
            imageIntent.SetType("image/*");
            imageIntent.SetAction(Intent.ActionGetContent);
            StartActivityForResult(Intent.CreateChooser(imageIntent, "Select photo"), 0);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    } 

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);

        if (requestCode == CAMERA_CAPTURE)
        {
        // camera operation
        }
        else
        {
            Console.WriteLine("choose pic from Gallery");
            var uri = data.Data;
            var path = getRealPathFromURI(uri); //path returns null when i select image from external storage;
        }
    }
    private String getRealPathFromURI(Uri contentURI)
    {
        string[] proj = { MediaStore.Images.ImageColumns.Data };
        String result;
        var cursor = ContentResolver.Query(contentURI, proj, null, null, null);
        if (cursor == null)
            result = contentURI.Path;
        else
        {
            int idx= cursor.GetColumnIndex(MediaStore.Images.ImageColumns.Data);
            cursor.MoveToFirst();
            result = cursor.GetString(idx);
            cursor.Close();
        }
        return result;
    }

【问题讨论】:

  • 你的意思是当你从图库中选择一张图片时,你想得到它的路径?
  • 是的,我想获取我从图库中选择的选定图像路径

标签: android xamarin xamarin.android android-permissions android-gallery


【解决方案1】:

我想获取我从图库中选择的选定图像路径

问题在于将Android.Net.Uri更改为path,这是一个解决方案:

private string GetPathToImage(Android.Net.Uri uri)
{
    string doc_id = "";
    using (var c1 = ContentResolver.Query(uri, null, null, null, null))
    {
        c1.MoveToFirst();
        string document_id = c1.GetString(0);
        doc_id = document_id.Substring(document_id.LastIndexOf(":") + 1);
    }

    string path = null;

    // The projection contains the columns we want to return in our query.
    string selection = Android.Provider.MediaStore.Images.Media.InterfaceConsts.Id + " =? ";
    using (var cursor = ContentResolver.Query(Android.Provider.MediaStore.Images.Media.ExternalContentUri, null, selection, new string[] { doc_id }, null))
    {
        if (cursor == null) return path;
        var columnIndex = cursor.GetColumnIndexOrThrow(Android.Provider.MediaStore.Images.Media.InterfaceConsts.Data);
        cursor.MoveToFirst();
        path = cursor.GetString(columnIndex);
    }
    return path;
}

当您从图库中选择图片时:

ChoosePhoto();
...
 protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
    if (requestCode == 0)
    {
        var uri = data.Data;
        var path = GetPathToImage(uri);
        System.Diagnostics.Debug.WriteLine("Image path == " + path );
        //My result is this ==> [0:] Image path == /storage/emulated/0/DCIM/Camera/IMG_20170813_223324.jpg
    }
 }

最重要的是,当你使用这种方法时,也许你会遇到这个问题:

Java.Lang.SecurityException: Permission Denial: 从 pid=21975、uid=10417 读取 com.android.providers.media.MediaProvider uri content://media/external/images/media 需要 android.permission.READ_EXTERNAL_STORAGE,或grantUriPermission()

当 API >= 23, Requesting Permissions at Run Time 时,用户在应用运行时授予应用权限,而不是在安装应用时。你应该检查你是否有android.permission.READ_EXTERNAL_STORAGE的权限,如果没有,你需要申请权限。

【讨论】:

  • York Shen,非常感谢您的回复。我在不需要图像路径的情况下解决了我的问题。但我确信我需要这个以供将来参考。我将很快尝试此代码并在其工作时投票。
  • @Amod,你试过这个解决方案吗?
  • 不,还没有,我已经到了完成项目的最后期限。我会在截止日期后尽快尝试
  • 你好@York Shen - MSFT 这对我有用。非常感谢。
  • 我试过了。像魅力一样工作。非常感谢客观和好的解决方案。因为我已经在运行时请求外部存储权限,所以这个解决方案是完美的。
猜你喜欢
  • 2015-08-30
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多