当前位置: 首页 > 知识库问答 >
问题:

如何捕获多个照片与相机xamarin窗体Android

葛昕
2023-03-14

我正在开发Xamrin表单应用程序。在它里面,我正试图用一台相机拍摄多张照片,目的相同。不使用任何numget包?

为此,我跟随这个链接摄像机

MainActivity.cs

static readonly File file = new File(Environment.GetExternalStoragePublicDirectory(
                                Environment.DirectoryPictures), "tmp.jpg");

在创建结束时

(Xamarin.Forms.Application.Current as App).ShouldTakePicture += () => {
    var intent = new Intent(MediaStore.ActionImageCapture);
    intent.PutExtra(MediaStore.ExtraOutput, Uri.FromFile(file));
    StartActivityForResult(intent, 0);
};

在这里,我只得到一张照片点击相机按钮,但我想捕捉更多的照片,我想要它的文件路径

在OnActivityResult中

(Xamarin.Forms.Application.Current as App).ShowImage(file.Path);

但是也许它有一些限制,比如我们不能一次拍摄多张照片?有人知道如何捕获多张照片并将其绑定到listview吗?

共有1个答案

仲孙阳
2023-03-14

是的,经过这么多的斗争,我能够做到这一点。这可能是有帮助的人谁是工作在xamarin形式这样的事情。

这是我的密码

 public partial class App : Application
    {
       // public static App Instance;

        public App ()
        {
            MainPage = new CameraGallery.MainPage();
            InitializeComponent();
        }
    }

主页。xaml

//请安装FlowListView和ffimageloading nuget pckg

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:CameraGallery"
             x:Class="CameraGallery.MainPage"
             xmlns:flv="clr-namespace:DLToolkit.Forms.Controls;assembly=DLToolkit.Forms.Controls.FlowListView"
             xmlns:ffimageloading="clr-namespace:FFImageLoading.Forms;assembly=FFImageLoading.Forms"> 

            <StackLayout x:Name="CameraLayout">
                <flv:FlowListView FlowColumnCount="3" x:Name="listItemsCam" 
                        SeparatorVisibility="None"
                        HasUnevenRows="false" RowHeight="100" >
                    <flv:FlowListView.FlowColumnTemplate>
                        <DataTemplate >
                            <ffimageloading:CachedImage  DownsampleToViewSize="true" AbsoluteLayout.LayoutFlags="All" HeightRequest="100" AbsoluteLayout.LayoutBounds="0,0,1,1" Source="{Binding .}"  Aspect="AspectFill" HorizontalOptions="FillAndExpand">
                            </ffimageloading:CachedImage>
                        </DataTemplate>
                    </flv:FlowListView.FlowColumnTemplate>
                </flv:FlowListView>
                <!--<Image x:Name="image" IsVisible="False"></Image>-->
            </StackLayout>
</ContentPage>  

主age.xaml.cs

 public partial class MainPage : ContentPage
        {
            ObservableCollection<string> camImageCollection;
            public static MainPage Instance;

            public MainPage()
            {
                InitializeComponent();
                Instance = this;

                var btn = new Button
                {
                    Text = "Snap!",
                    Command = new Command(o => ShouldTakePicture()),
                };
                CameraLayout.Children.Add(btn);  

                camImageCollection = new ObservableCollection<string>();
            }
            public event Action ShouldTakePicture = () => { };

            public void ShowImage(string[] filepath)
            {
               foreach(var item in filepath)
                 camImageCollection.Add(item);
                 listItemsCam.FlowItemsSource = camImageCollection;
            }
        }

现在转到it MainActivity中的android项目。反恐精英

[Activity(Label = "CameraGallery", Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        public static int OPENCAMERACODE = 102;
        //inside OnCreate after LoadApplication(new App()); add these lines
         protected override void OnCreate(Bundle bundle)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;
            UserDialogs.Init(this);
            base.OnCreate(bundle);

            global::Xamarin.Forms.Forms.Init(this, bundle);

            FlowListView.Init();
            CachedImageRenderer.Init(false);
            LoadApplication(new App());
            MainPage.Instance.ShouldTakePicture += () =>
            {
                ICursor cursor = loadCursor();
                image_count_before = cursor.Count;
                cursor.Close();
                Intent intent = new Intent(MediaStore.IntentActionStillImageCamera);
                IList<ResolveInfo> activities = PackageManager.QueryIntentActivities(intent, 0);
                if(activities.Count >0)
                    StartActivityForResult(Intent.CreateChooser(intent, "Camera Capture"), OPENCAMERACODE);
            };
        }
        public ICursor loadCursor()
        {
            string[] columns = new string[] { MediaStore.Images.ImageColumns.Data, MediaStore.Images.ImageColumns.Id };
            string orderBy = MediaStore.Images.ImageColumns.DateAdded;
            return ContentResolver.Query(MediaStore.Images.Media.ExternalContentUri, columns, null, null, orderBy);
        }
        private void exitingCamera()
        {
            ICursor cursor = loadCursor();
            string[] paths = getImagePaths(cursor, image_count_before);
            MainPage.Instance.ShowImage(paths);// this parameter pass to MainPage.xaml.cs
            cursor.Close();
        }
        public string[] getImagePaths(ICursor cursor, int startPosition)
        {
            int size = cursor.Count - startPosition;
            if (size <= 0) return null;
            string[] paths = new string[size];

            int dataColumnIndex = cursor.GetColumnIndex(MediaStore.Images.ImageColumns.Data);
            for (int i = startPosition; i < cursor.Count; i++)
            {
                cursor.MoveToPosition(i);

                paths[i - startPosition] = cursor.GetString(dataColumnIndex);
            }
            return paths;
        }
        //inside OnActivityResult method do this
        protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);
            switch (requestCode)
            {
                case 102:
                        exitingCamera();
                    break;
            }
        }
    }   

我希望这能帮助别人。享受编码。。。

 类似资料:
  • 在我的应用程序中,当我通过以下方式调用相机意图时: 它不调用方法。 我的应用程序中的问题是,有时它调用这个方法,但在捕获照片后的一段时间,它再次来到照片捕获屏幕。

  • 问题内容: 我在通过Android按钮单击时无法找到打开用户相机胶卷/照片库的方法。我正在寻找的解决方案包括访问相机胶卷/照片厨房,允许用户选择图像,将所选图像保存到文件中,然后最后将该文件保存到诸如parse.com之类的数据库中。请帮助并提前感谢您! 请参考下面的链接。我希望实现类似于IOS上的实现。 https://drive.google.com/file/d/0B4jjwQsKhqZRc

  • 我是Android Studio的新手。我想通过点击按钮用手机摄像头拍摄照片,然后显示拍摄的照片,照片将自动保存在手机图库中。我在网上找到了一些例子,但我拍摄的照片没有保存在图库中。我已经使用了下面的代码。我能得到一些帮助吗?

  • 在lollipop和更高版本中从相机捕获图像时,在OnActivityResult上获得结果数据null。 launchCamera(); getOutputMediaFileUri() getOutputMediaFile()

  • 我正在尝试允许用户用相机应用程序拍摄一张照片,然后在应用程序中显示它的预览。 我还需要在应用程序的稍后阶段访问该文件(但这不是一个问题) 我有以下崩溃: 完成时处理图像: 我不明白为什么它只是4.4.4的问题,而不是其他操作系统。 当出现崩溃时,它并没有说我的应用程序崩溃了,它说Camera已经停止工作了,并且我只能在没有过滤器的情况下查看日志时查看崩溃,这意味着崩溃不在我的应用程序中?

  • 如何处理? 严重性代码描述项目文件行抑制状态错误java.lang.IllegalArgumentExcema:已经添加:Landroid/support/v4/Accsibilityservice/AccessibilityServiceInfoCompat;