首页 > 解决方案 > 根据 Xam.Plugin.Media 拍摄的图片创建图库

问题描述

我在 Xamarin.forms 和 c# 和应用程序开发中有点新。目前我正在开发一个可以拍照的应用程序,然后你可以将它们发送到服务器,这样你就可以在 WebApp 上检查它们。我正在使用 Xamarin.Forms。

问题是我正在疯狂地尝试用你拍的照片创建一个画廊。有点像以“无限滚动视图 + 2x2 网格”的方式显示保存在系统文件夹(不是设备的默认图库)中的图片。

如果有人能指出我正确的方向或给我一个提示、链接、示例等,我将非常感激!><

这是应用程序现在的样子:

这是我的目标:

我的 XAML 非常简单:

 <ScrollView>
            <StackLayout
                Margin="20">

                <Image
                    x:Name="PhotoImage" />

                <StackLayout
                    Orientation="Horizontal" >

                    <Button 
                        x:Name="CameraButton"
                        BackgroundColor="#95c241"
                        Text="Foto aufnehmen"
                        TextColor="White"
                        Clicked="CameraButton_Clicked"
                        HorizontalOptions="Start" 
                        />

                    <!--<Button
                        x:Name="selectimagebutton"
                        BackgroundColor="#4ab8ae"
                        Clicked="selectimagebutton_clicked"
                        Text="aus der gallerie"
                        TextColor="white"
                        HorizontalOptions="endandexpand" 

                        />-->

                    <Button
                        x:Name="SyncButton"
                        BackgroundColor="#95c241"
                        Clicked="SyncButton_Clicked"
                        Text="Synchronisierung"
                        TextColor="White"
                        HorizontalOptions="EndAndExpand" />

                </StackLayout>

我的 MainPage.xampl.cs。我抽了很多次,不知道对你有没有帮助:

//Camera Logic
    public async Task<bool> CheckPhotoPermissionsAsync()
    {
        var cameraStatus = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Camera);
        var storageStatus = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage);

        if (cameraStatus != PermissionStatus.Granted || storageStatus != PermissionStatus.Granted)
        {
            var results = await CrossPermissions.Current.RequestPermissionsAsync(new[] { Permission.Camera, Permission.Storage });
            cameraStatus = results[Permission.Camera];
            storageStatus = results[Permission.Storage];
        }

        return cameraStatus == PermissionStatus.Granted || storageStatus == PermissionStatus.Granted;
    }

        private async void CameraButton_Clicked(object sender, EventArgs e)
    {
        //Toma la foto y la muestra directamente en la pagina
        //Macht ein Foto und zeigt es auf diese Seite

        bool photoPermissions = await CheckPhotoPermissionsAsync();

        if (!photoPermissions)
        {
            await DisplayAlert("Achtung!", "Damit die App einwandfrei läuft, mussen Sie den Zulassungen zustimmen", "ok");
            return;
        }
        else
        {
            await CrossMedia.Current.Initialize();

            if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
            {
                //If camera option not available
                //Falls das Handy keine Kamera hat
                await DisplayAlert("Hmmm...!", "Das Gerät hat kein Zugriff auf die Kamera...", "ok");
                return;
            }

            var mediaFile = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
            {
                SaveToAlbum = false,
                //Directory = "FotoApp_Folder",
                Name = fileName(),

                PhotoSize = PhotoSize.Custom,

                //SaveMetaData = false,

                //Nurr bei PhotoSize.Custom
                CustomPhotoSize = 20,
                CompressionQuality = 70,

                //Only for iOS
                AllowCropping = true

            });

            //var mediaFile = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
            //{
            //    SaveToAlbum = false,
            //});

            //await saveScaleAsync(mediaFile);
            //Debug.WriteLine("It work baby! The mediaFile is: " + mediaFile);

            await saveMediaFile(mediaFile);

            var x = ImageSource.FromStream(() =>
            {
                var stream = mediaFile.GetStream();
                //mediaFile.Dispose();
                return stream;                                     

            });

            Debug.WriteLine("It works baby! The mediaFile is: " + mediaFile);

            //await ToBase64(mediaFile);

        }
    }

    private async Task saveMediaFile(MediaFile mediaFile)
    {
        if (mediaFile == null)
        {
            //Falls kein Bild vorhanden ist
            await DisplayAlert("Ups!", "Es gibt kein Bild vorhanden", "ok");
            return;
        }
        try
        {
            var xxx = mediaFile.Path;

            //PhotoTable ist eine Klasse in diesem Fall , die die Attribute vom DB hat.
            var s = new PhotoTable
            {
                Filename = mediaFile.Path,
                Created_At = DateTime.Now,
                Sync_At = null
            };

            await HelperDB.Instance.conn.InsertAsync(s);
            PhotoImage.Source = ImageSource.FromStream(() => mediaFile.GetStream());

        }
        catch (Exception ee)
        {
            //Falls was nicht mit dem DB klappt....
            await DisplayAlert("Ups!", "Bitte versuchen Sie das nochmal. Es gab ein problem mit dem DB" + ee.ToString(), "ok");
        }

        updateText();

    }

    public string fileName()
    {
        DateTime d = DateTime.Now;

        string fileName = $"IMAGE_{d.ToString("yyyyMMdd_HHmmss")}_.jpg";

        return fileName;
    }

标签: c#pluginsxamarin.formsgallerymedia

解决方案


推荐阅读