我正在尝试在此活动开始时显示本地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生命周期有关?或者我错过了更大的东西?
答案 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;
}