[英]Xamarin - Is there a similar framework to Photokit (iOS) available for Android, or a good way to get the filestream of all images in the gallery?
我目前正在创建一个Xamarin Forms应用程序,以查找设备库中的所有图像并将它们显示在网格中。 我想使用带有本机实现的DepdencyService来做到这一点。
对于iOS,我使用Photokit框架获取每个图像的Stream,并将其输入到我的网格中。
我正在寻找一种解决该问题的方法,适用于Android。 我尝试浏览文档,但似乎找不到能做到这一点的东西。
风景
private void GetGallery()
{
var imageStreams = DependencyService.Get<IGalleryFetcher>().GalleryStream();
foreach (var stream in imageStreams)
{
// Create image objects and set the stream as the image source
}
iOS实施
public ObservableCollection<Stream> GalleryStream()
{
var streamArray = new ObservableCollection<Stream>();
PHFetchResult fetchResult = PHAsset.FetchAssets(PHAssetMediaType.Image, null);
for (int i = 0; i < fetchResult.Count(); i++)
{
PHAsset phAsset = (PHAsset)fetchResult[i];
string fileName = (NSString)phAsset.ValueForKey((NSString)"filename");
PHImageManager.DefaultManager.RequestImageData(phAsset, null, (data, dataUti, orientation, info) =>
{
var path = (info?[(NSString)@"PHImageFileURLKey"] as NSUrl).FilePathUrl.Path;
Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
streamArray.Add(stream);
});
}
return streamArray;
}
Android实施
//Help needed
有没有可用的框架或软件包可以帮助我像在iOS中一样为Android做类似的事情?
编辑:我使用CrossMedia插件来拍摄和选择图像,但是我找不到该插件提供所需的功能。
我想要的功能是从图库中获取所有图像不需要主动操作或选择。 没有文件选择器或导入操作,打开视图时,应自动收回每个图像的(文件)流。
您可以在Android中使用ContentResolver 。
在Manifest.xml
添加以下权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
void GetAllImage()
{
Android.Net.Uri imageUri = MediaStore.Images.Media.ExternalContentUri;
var carsor = ContentResolver.Query(imageUri,null, MediaStore.Images.ImageColumns.MimeType + "=? or "+ MediaStore.Images.ImageColumns.MimeType+ "=?",new string[] { "image/jpeg", "image/png" }, MediaStore.Images.ImageColumns.DateModified);
while(carsor.MoveToNext())
{
string path = carsor.GetString(carsor.GetColumnIndex(MediaStore.Images.ImageColumns.Data));
Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
streamArray.Add(stream);
}
}
有兴趣的人的解决方案摘要。
根据@Lucas Zhanf-MSFT的回答,这是最终的解决方案。
Android-GalleryFetcherAndroid
public ObservableCollection<string> GalleryStream()
{
var gallerySources = new ObservableCollection<string>();
Android.Net.Uri imageUri = MediaStore.Images.Media.ExternalContentUri;
var cursor = Android.App.Application.Context.ContentResolver.Query(imageUri, null, MediaStore.Images.ImageColumns.MimeType + "=? or " + MediaStore.Images.ImageColumns.MimeType + "=?", new string[] { "image/jpeg", "image/png" }, MediaStore.Images.ImageColumns.DateModified);
while (cursor.MoveToNext())
{
string path = cursor.GetString(cursor.GetColumnIndex(MediaStore.Images.ImageColumns.Data));
gallerySources.Add(path);
}
return gallerySources;
}
iOS-GalleryFetcheriOS
public ObservableCollection<string> GalleryStream()
{
var streamArray = new ObservableCollection<string>();
PHFetchResult fetchResult = PHAsset.FetchAssets(PHAssetMediaType.Image, null);
for (int i = 0; i < fetchResult.Count(); i++)
{
PHAsset phAsset = (PHAsset)fetchResult[i];
string fileName = (NSString)phAsset.ValueForKey((NSString)"filename");
PHImageManager.DefaultManager.RequestImageData(phAsset, null, (data, dataUti, orientation, info) =>
{
var path = (info?[(NSString)@"PHImageFileURLKey"] as NSUrl).FilePathUrl.Path;
streamArray.Add(path);
});
}
return streamArray;
}
表单界面-IGalleryFetcher
public interface IGalleryFetcher
{
ObservableCollection<string> GalleryStream();
}
用法示例-ContentPage
private void GetGallery()
{
var imageSources = DependencyService.Get<IGalleryFetcher>().GalleryStream();
foreach (var imageSource in imageSources)
{
//Consider applying a limitation to the amount of images to load
ImageSource source = ImageSource.FromFile(imageSource);
//Use the image source for your view
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.