繁体   English   中英

Xamarin-是否有与Android可用的Photokit(iOS)类似的框架,或者是获取图库中所有图像文件流的好方法?

[英]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" />

在您的DepdencyService中

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM