如何使用相机 xamarin Forms android 拍摄多张照片

2023-12-06

我正在开发 Xamarin 表单应用程序。在其中,我尝试使用具有相同意图的相机拍摄多张照片。不使用任何nuget包裹?

为此,我正在关注此链接Camera

MainActivity.cs

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

OnCreate 结束时

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

在这里,单击相机按钮时我只得到 1 张照片,但我想捕获更多照片并且我想要它的文件路径

在活动结果中

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

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


是的,经过这么多的努力,我能够做到这一点。对于以 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>  

MainPage.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;
            }
        }

现在进入你的android项目里面的MainActivity.cs

[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;
            }
        }
    }   

我希望这对某人有帮助。享受编码...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用相机 xamarin Forms android 拍摄多张照片 的相关文章

  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

    In 本教程 https emscripten org docs porting connecting cpp and javascript Interacting with code html interacting with code
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • 如何在android中启动和停止gif图像

    在我的应用程序中 我想播放 gif 图像 我可以播放 gif 图像 但我想处理 gif 图像 例如 如果我单击开始按钮动画应该开始 如果单击停止按钮动画应该停止 strtbtn setOnClickListener this public
  • 如何获取 Highcharts 工具提示中的下一个点

    如何从工具提示格式化程序访问本系列的下一点 因为我想在两点之间求和 就像 this y next y 但我不知道如何访问下一点 这需要通过几个步骤完成 根据x value获取x index var index this series xDa
  • 为什么JS函数名与元素ID冲突?

    我有两个几乎相同的简单 JS 小提琴 在选择更改时调用函数 在这两种情况下 函数名称与 select ID 相同 但由于某种原因 第一个小提琴工作得很好 而第二个小提琴因 JavaScript 错误而失败is not a function
  • Heroku + git = ENOENT:生成 git ENOENT

    我是 Ubuntu 17 04 的新手 所以我在 git 和 Heroku 方面遇到了一些麻烦 当我跑步时 heroku create或者尝试克隆在 Windows 上创建的令人兴奋的存储库 应用程序heroku git clone a a
  • 仅使用纯 JavaScript(无 jQuery)将元素添加到给定纯文本 HTML 的 DOM

    我需要能够向给定 HTML 原始文本字符串的页面添加元素 包括任意数量的标签 属性等 理想情况下 我希望能够对任意格式良好的 html 字符串执行类似操作 var theElement document createElement h1 S
  • UIButton:设置选定突出显示状态的图像

    我为按钮的状态 正常 突出显示 和 选定 设置了图像 但是当按钮处于选定状态并且我按下 突出显示它时 我没有看到突出显示的图像 而只是看到灰色的图片 是否可以在选择按钮时设置突出显示状态的图像 my code button setImage
  • 非分区 Parquet 数据上的谓词下推

    我在 S3 中有一个文件夹 其中包含 Parquet 数据 存储桶名称 文件夹名称 年 月 日 eg s3 bucket name folder name 2020 12 10 我在用Apache spark on AWS EMR读取镶木地
  • 苹果 bonjour 安卓版

    我正在寻找适用于 Android 的 Apple bonjour 有推荐的罐子吗 我在 google 上搜索了 apple bonjour 应用程序 找到了 Jmdns 应用程序http home heeere com tech andro
  • Google Api 客户端已使用 id 0 进行管理

    我想连接GoogleApiClient在活动中 当用户第一次单击按钮并出现此对话框时 它工作正常 但是当用户按后退按钮并重新单击负责初始化的按钮时 它工作正常GoogleApiClient 我收到此错误 java lang IllegalS
  • 如何防止同一分支并行运行 GitHub 操作(包括拉取请求)?

    我有一个 GitHub 操作 它可以从分支 拉取请求或手动触发 我想实现以下目标 决不能有两个从同一分支并行运行的操作实例 包括来自该分支的拉取请求 我最好的想法是这样做 伪代码 concurrency if github head ref
  • 当我在 SQL 2005 中删除聚集主键时会发生什么

    我有一个 PK 约束 两列上的聚集索引 我正在删除它 一小时后该命令仍在运行 我本以为 由于我只是删除一个约束 所以操作几乎是瞬时的 有人可以向我解释一下当我放弃 PK 时到底发生了什么吗 聚集索引不仅仅是 一种约束 它是一种存储方法 当您
  • 使用 ASP.NET .ashx 模块下载文件

    我有 ASP NET 页面 上面有一个 iframe 用于在此页面上显示一些 pdf 报告 当用户从下拉列表中选择报告类型时 我将所需的报告数据添加到 ASP NET 会话中 并将 iframe 的属性 src 更改为生成 pdf 报告的
  • 如何解决pandas中由于chunksize而导致的错误?

    我正在尝试读取一个大的 csv 文件并运行代码 我使用块大小来执行相同的操作 file data csv df pd read csv file sep header 0 iterator True chunksize 1000000 dt
  • 简单的 ASP.Net 消息框?

    我想要一个简单的 ASP Net MessageBox 但我尝试的所有方法都不起作用 我不知道为什么 我尝试的最后一件事是this但它也不起作用 对于一个安全工作的简单消息框有什么想法吗 了解更多信息 我无法将任何内容绑定到按钮 我必须从背
  • 选择/选项中的光标错误,IE

    当文本位于选项下方时 我遇到选项光标错误的问题 通常 该选项使用 默认 光标 但是当例如 该段落位于选项下 在 IE 中我看到 文本 光标 Code
  • Xamarin - 将图像转换为字节数组

    我使用媒体插件从 Android 设备或 iOS 设备拍摄或挑选照片 然后我想使用 LINQtoTwitter 将该图像发布到 Twitter 上 为此 图像需要采用 bytes 格式 如何将图像转换为字节以便上传 获取图像的代码 take
  • 如何从当前系统日期中减去 45 天 [重复]

    这个问题在这里已经有答案了 可能的重复 有人知道使用java日历减去X天的日期的简单方法吗 Hi 有人能告诉我如何从当前系统日期中减去 45 天吗 Thanks 您可以使用日历类 Calendar cal Calendar getInsta
  • 按键及其项目过滤对象

    我有一个对象 我想过滤它的键 我试图通过 ID 过滤对象 如下所示 let myKeys Object keys data filter function key console log data key if parseInt key p
  • entityManager.persist 不将任何内容保存到数据库

    I use Spring 4 2 5 and org hibernate 5 1 0 当我使用entityManager persist user 保存user 它无法保存到数据库 并且不会抛出错误 但如果我添加entityManager
  • 如何使用相机 xamarin Forms android 拍摄多张照片

    我正在开发 Xamarin 表单应用程序 在其中 我尝试使用具有相同意图的相机拍摄多张照片 不使用任何nuget包裹 为此 我正在关注此链接Camera MainActivity cs static readonly File file n