[英]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.