Xamarin.Android - " resolveURI在错误的位图URI"解析编码后的字符串

时间:2016-06-15 03:58:52

标签: android xamarin xamarin.android uri

我正在尝试在此活动开始时显示本地URI中的图像。

用户选择图像,触发OnActivityResult()方法。当我第一次获得URI时,它显示图像没有问题:

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    if (requestCode == IMG_REQUEST_CODE && resultCode == Result.Ok)
    {
        Android.Net.Uri imageUri = null;
        if (data != null)
        {
            imageUri = data.Data;
            userPreferences.BackgroundImageURI = imageUri.ToString();
            imgView.SetImageURI(imageUri);
            imgView.Visibility = ViewStates.Visible;
        }
    }
}

如您所见,我将URI存储为userPreferences中的编码字符串。这将保存到设备中,并且可以毫无问题地加载。在这种情况下,字符串为content://com.android.providers.media.documents/document/image%3A38,从内存加载时(使用共享首选项)它是相同的。

这是我的代码,用于加载编码的URI字符串,解析字符串以创建URI,然后设置imgView的URI以显示该图像。

 protected override void OnCreate(Bundle bundle)
 {
    base.OnCreate(bundle);
    SetContentView(Resource.Layout.Preferences);

    userPreferences = Helpers.LoadUserPreferences(this, new Shared.Model.UserPreferences());

    imgView = FindViewById<ImageView>(Resource.Id.imgView);
    if (!string.IsNullOrWhiteSpace(userPreferences.BackgroundImageURI))
    {
        var imgURI = Android.Net.Uri.Parse(userPreferences.BackgroundImageURI);
        imgView.SetImageURI(imgURI);
        imgView.Visibility = ViewStates.Visible;
    }
    else
    {
        imgView.Visibility = ViewStates.Invisible;
    }
}

当它到达SetView(imgUri)行时,我收到此输出:resolveUri failed on bad bitmap uri: content://com.android.providers.media.documents/document/image%3A38

我甚至尝试过对URI进行硬编码无济于事。主要的挫折是代码是相同的,只是在两种不同的场景中运行。是否可能与Activity生命周期有关?或者我错过了更大的东西?

1 个答案:

答案 0 :(得分:1)

试试这个:

if (!string.IsNullOrWhiteSpace(userPreferences.BackgroundImageURI))
{
    var imgURI = Android.Net.Uri.Parse(userPreferences.BackgroundImageURI);
    var input = Activity.ContentResolver.OpenInputStream(imgURI);
    imgView.SetImageBitmap(BitmapFactory.DecodeStream(input));
    imgView.Visibility = ViewStates.Visible;
}
else
{
    imgView.Visibility = ViewStates.Invisible;
}

作为替代我有一个类从URI获取图像的真实路径。如果您想将该路径提供给CropActivity,那可能会很棒。

您可以从here下载课程。

并像这样使用它:

if (!string.IsNullOrWhiteSpace(userPreferences.BackgroundImageURI))
{
    var imgURI = Android.Net.Uri.Parse(userPreferences.BackgroundImageURI);
    imgView.SetImageURI (Uri.Parse(PathUtils.PathUtils.GetPath(Activity, imgURI)));
    imgView.Visibility = ViewStates.Visible;
}
else
{
    imgView.Visibility = ViewStates.Invisible;
}