簡體   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