Xamarin.Android - "resolveURI failed on bad bitmap URI" 解析编码字符串后

Xamarin.Android - "resolveURI failed on bad bitmap URI" after parsing encoded string

我正尝试在 activity 开始时显示来自本地 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 生命周期有关吗?还是我错过了更大的东西?

试试这个:

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

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

您可以从 here 下载 class。

并像这样使用它:

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