我在外部存储中有一个项目的图片(在我的应用程序中被意图保存)。我想在我的共享项目的Image
视图中显示这张图片。
Image.Source
获取ImageSource
类型的对象。我尝试了ImageSource.FromFile
,ImageSource.FromStream
甚至是ImageSource.FromUri
。结果始终是不显示图像(没有错误或异常)。我首先用File.Open
上面的一行打开它来验证文件的路径是否正确。
从正常存储中显示图片的正确方法是什么,而不是从资产/资源/等?
此代码不起作用:
var path = "/storage/emulated/0/Pictures/6afbd8c6-bb1e-49d3-838c-0fa809e97cf1.jpg" //in real app the path is taken from DB
var image = new Image() {Aspect = Aspect.AspectFit, WidthRequest = 200, HeightRequest = 200};
image.Source = ImageSource.FromFile(path);
答案 0 :(得分:4)
你的Xamarin Forms PCL不知道它的Android是什么,因为它特定于平台,所以:
ImageSource.FromFile(path);
无效。
在这种情况下,您正在处理特定于平台的功能,即从Android加载图像。 我建议采用这种方法:
在Xamarin Forms PCL上创建一个界面,如:
public interface IPhoto
{
Task<Stream> GetPhoto ();
}
然后在Android中,您实现该接口并在DependencyService
中注册实现:
[assembly: Xamarin.Forms.Dependency(typeof(PhotoImplementation))]
namespace xpto
{
public class PhotoImplementation : Java.Lang.Object, IPhoto
{
public async Task<Stream> GetPhoto()
{
// Open the photo and put it in a Stream to return
var memoryStream = new MemoryStream();
using (var source = System.IO.File.OpenRead(path))
{
await source.CopyToAsync(memoryStream);
}
return memoryStream;
}
}
}
在Xamarin Forms PCL代码中获取图像:
var image = ImageSource.FromStream ( () => await DependencyService.Get<IPhoto>().GetPhoto());
有关详细信息,请参阅this。
注意1:如果您也实现了IPhoto接口,这将适用于iOS。
注意2:Xamarin-Forms-Labs中存在一个名为Camera的此类功能的有用库。
更新(共享项目解决方案)
根据评论中的要求,要在共享项目中使用它而不是PCL,我们可以这样做。
1 - 将IPhotoInterface
放入共享项目中。
2 - 在Android / iOS项目中实现界面:
public class PhotoImplementation : IPhoto
{
public async Task<Stream> GetPhoto()
{
// Open the photo and put it in a Stream to return.
}
}
3 - 在共享项目中使用它:
IPhoto iPhotoImplementation;
#if __ANDROID__
iPhotoImplementation = new shared_native.Droid.GetPicture();
#elif __IOS__
iPhotoImplementation = new shared_native.iOS.GetPicture();
#endif
var image = ImageSource.FromStream ( () => await iPhotoImplementation.GetPhoto());
注意:shared_native
是我的解决方案的命名空间,Droid/iOS
是适用于Android和iOS的项目。