• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

使用Delphi进行相机访问

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

原文:https://community.idera.com/developer-tools/b/blog/posts/mit-delphi-zu-mobilen-welten---app-programmierung-tutorial-teil-2-kamera-zugriff-mit-delphi

 

应用编程教程第2部分:使用Delphi进行相机访问

在本教程的第二部分中,我们将使用Delphi开发环境查看跨平台和跨设备应用程序编程的选定方面。它将与移动设备的硬件配合使用。如何从相机轻松检索图像或确定当前位置?德尔福提供了许多现成的组件,可以使工作进展迅速。

本文深入介绍了使用集成开发环境Delphi的移动设备编程应用程序的知识。我们提供了一个关于应用程序开发入门的两部分教程。第1部分, 你可以在这里阅读,在那里,您将学习如何设置系统环境并设置开发环境。同样,我们使用一个非常简单的示例,经历了整个开发周期 - 从项目的开始到智能手机/平板电脑上的应用程序的执行。这一切都非常有趣,希望引起你的兴趣。当然,要开发一个应用程序。它必须与移动设备的特定硬件一起工作,例如使用传感器或相机。人们必须考虑如何将数据从本地设备传输到特殊的云后端,并解决应用程序开发的其他特定问题。事实上,两个相关的系统,即Android和iOS,基本上以不同的方式工作并增加发展的努力。在第一部分结束时,您看到在Delphi的帮助下,您可以非常优雅地解决这个问题。用户界面(UI)完全使用图形设计器中的组件创建。跨设备图形框架FireMonkey确保它为目标系统生成自动定制的用户界面。类似地,对于许多重复性任务,可以使用所谓的非可视组件,这可以显着减少开发工作量。用户界面(UI)完全使用图形设计器中的组件创建。跨设备图形框架FireMonkey确保它为目标系统生成自动定制的用户界面。类似地,对于许多重复性任务,可以使用所谓的非可视组件,这可以显着减少开发工作量。用户界面(UI)完全使用图形设计器中的组件创建。跨设备图形框架FireMonkey确保它为目标系统生成自动定制的用户界面。类似地,对于许多重复性任务,可以使用所谓的非可视组件,这可以显着减少开发工作量。

在本教程的这一部分中,我们希望在Delphi的帮助下进一步研究应用程序开发的实践,并突出选择的方面。最后,出现了一个最小应用程序的示例。您可以使用内置摄像头拍摄照片,并在选择服务后进行分发。

现在我们已经可以告诉你,对于许多典型的任务,通常只需要相对较少的代码。我们希望您喜欢品尝并期待Apple和Google商店中的应用!

Delphi 10.3.1的更新

从本教程的第一部分开始,集成开发环境Delphi经历了一次重要的更新。上次我们向您介绍了使用社区版10.2.3版。与此同时,Delphi Community Edition 10.3.1版本是最新版本。它提供了一些新功能,例如更现代和用户友好的界面,支持Android和iOS移动平台的更新,以及Delphi编程语言的一些高级功能。因此,我们建议更新当前版本10.3.1。如果您的系统上有旧版本,请事先通过“控制面板”将其卸载。然后下载Delphi Community Editions当前版本10.3.1的安装文件。https://www.embarcadero.com/en/products/delphi/starter/free-download。如果您尚未登录,请事先登录您的帐户或注册。安装时请确保添加Delphi iOS社区和Delphi Android社区拥有必要的系统库,用于在开发机器上为iOS和Android编程应用程序。根据您的互联网连接速度,安装需要一些时间。之后,Delphi Community Edition 10.3.1将推出一个全新的界面。如果你继续使用以前版本的Delphi Community Edition 10.2.3(暂时),请注意一些对话框看起来与本教程略有不同。我们在这里使用当前版本的Delphi Community Edition 10.3.1。但是,所描述的功能在先前版本中的工作方式相同。

集成开发环境Delphi Community 10.3

使用特定于应用程序的硬件

移动设备,即智能手机和平板电脑,具有特殊硬件,具体取决于设备和性能等级。在几乎每个移动设备中,至少有一个摄像头,蓝牙接收和发送单元以及基于GPS传感器的定位系统。其他特定硬件例如是位置传感器或指纹传感器。Android和iOS的系统库提供编程接口(API)以使用此硬件。由于Android和iOS需要与开发人员完全不同的方法,因此它变得复杂。Delphi通过基于组件的跨设备编程方法解决了这个问题。工具选项板提供了一系列视觉和非视觉组件。这些可以拖放到申请表中。通过这些组件,封装了到不同系统的接口。然后,您只需针对与系统无关的组件进行编程,即复杂性显着降低。

要进行初始实验,请通过菜单项:File |创建一个新的跨设备项目 新的跨设备应用程序 - Delphi:

创建一个新项目。

例如,选择“ 清空”应用程序选项。我们现在对调色板中的一些组件感兴趣,以实现特定于应用程序的功能。

 

 

例如,可以在传感器下方找到用于特定应用功能的组件。

这些包括传感器范围以下:

  • TLocationSensor:添加易于配置的位置功能。
  • TMotionSenor:使用此组件触发运动传感器。
  • TOrientationSensor:用于查询方向传感器的数据。

 在系统区域下方,您将找到以下组件:

  • TBluethoothLE / TBluethooth:支持使用内置的Bluethooth模块发送和接收数据。
  • TBeacon / TBeaconDevice:支持使用信标技术进行设备通信和监控。这些是用于近场通信的紧凑型蓝牙发射器,主要用于建筑物。
  • TNotificationCenter:您可以在此处使用操作系统的内部消息服务。

在区域束缚,所谓的在你的应用程序使用在相同或远程设备可以进行交互发现其他应用程序的App-圈养组件。为此,应用程序可以使用app tethering发布操作。然后,其他应用程序可以在第一个应用程序中远程调用这些操作,并在应用程

从区域此外,所述部件是经常TCameraComponent使用它封装的功能内置在该装置的照相机。从服务领域来看,组件:TInAppPurchase和TMapView特别受关注。通过TInAppPurchase您可以访问应用程序内支付服务。借助应用内付款服务,您可以直接向您的应用销售数字内容。TInAppPurchase从每个应用内支付服务和平台的特点中抽象出您的应用。您可以使用TMapView组件在应用程序中创建地理地图再次,抽象是值得的。系统内部的功能类似,但是,在不同的地图上使用,即Android使用谷歌地图,iOS依赖于内部的Apple地图。已知Android地图需要自己的应用专用**。使用RAD Studio进行编程时也没有什么不同。您需要在Google上为该应用创建**。在RAD Studio中,您必须在项目选项中设置地图控件的权限(在Android | Debug下)。您也可以在此处存储API**。对于iOS,不需要这样的**,即应该直接显示卡。

应用需要数据和服务。他们通常从云端获得。后端即服务(BaaS)提供商已经建立了自己的应用程序的特殊功能。它们提供典型的服务,如数据存储,用户管理,社交网络集成和推送通知。所有BaaS提供商都以类似的方式工作,但细节则完全不同。通常,您必须通过在线仪表板进行初始配置。然后,与应用程序的交互通过定义的界面进行,或者通过提供特定的SDK进行简化,其目标是再次降低交互的复杂性。Delphi在BAAS Client下方提供条目用于简化配置的几个非可视控件,例如BaqS Kinvey服务。同样,可以找到通常主要应用程序的组件,例如用户管理或数据存储。

Delphi提供了许多非可视组件来将应用程序连接到后端。 

Cloud部分中的组件也有类似的方向:

  • TAmazonConnectionInfo:它提供对Amazon Simple Queue Service(SQS),Amazon Simple Storage Service(S3)和Amazon SimpleDB Service的支持。
  • TAzureConnectionInfo:这些组件为移动应用程序提供Azure门户的功能。

这些组件用于使用云服务创建多层应用程序。要使用REST服务,请查看条目REST Client下面提供的组件。

从相机获取图片

作为第一个实验,我们希望使用移动设备的内置摄像头。我们创建一个最小的用户界面。为此,我们在主窗体上放置一个ToolBar组件,在组件中放置一个TButton类型的按钮。在工具栏组件下方,我们安排了TImage类型的组件。用于显示相机拍摄的照片。该物业对齐的图像部分,我们把重点放在价值上的客户端完全填充表格上的可用空间。对于按钮,我们将属性StyleLookup调整为值cameratoolbutton on。这将为按钮提供相应的图标。对于实际的功能,即从内置摄像头中检索图像,我们可以幸运地采用所谓的Delphi 标准动作。标准操作包括在后台完成实现,主要通过配置和少量代码实现常用功能。这需要使用TActionList类型的动作管理器。您还可以在表单上放置此类组件。这看起来像这样:

 

 

 

在表单上放置组件。 

现在是关于选择适当的默认操作。双击ActionList并添加新的默认操作。

从可用的标准操作中选择条目TTakePhotoFromCameraAction。

结构视图为您提供应用程序所有操作的概述。

现在,切换到Object Inspector并调用TTakePhotoFromCameraAction类型的新创建的对象。**事件并为OnDidFinishTaking事件创建代码。

Object Inspector将事件绑定到选定的操作。

在这种情况下,实际的源代码只涵盖一行,也就是说,我们将图像资源分配给相机提供的表面上的Image对象。这适用于:

Image1.Bitmap.Assign(Image);

只需要一条源线就可以将捕获的图像传递给图像组件。

从功能上讲,此时已经差不多完成了。如果仅针对iOS编程,则省略这些步骤,并且必须通过单击按钮仅调用默认操作TTakePhotoFromCameraAction来调用它们。您可以通过将Action属性与按钮的Object Inspector中的TTakePhotoFromCameraAction条目相链接来完成此操作。

如果应用程序应该在两个系统上运行,即Android和iOS,请不要在此处绑定Action属性。然后,这将由按钮的click事件触发,就像Android一样,必须先检查并可能请求权限。我们现在就会谈到这一点。如果您仅为iOS构建应用程序,则可以跳过此部分。

检查Android上的权限

如果您还将Android作为目标系统,则必须确保您的应用可以使用相机并保存数据。换句话说,您必须获得适当的权限。这在Android中分两个阶段发生。必须始终在清单文件中指定授权。此文件中的条目可在项目选项中的Delphi中方便地进行管理。通过使用标准操作TTakePhotoFromCameraAction,已经在此处进行了必要的输入。您可以通过菜单项Project |随时执行此操作 选项然后使用该条目来跟踪权限。

在项目选项中设置权限。

Android将其划分为“正常”和“危险”权限。除了清单文件中的条目(项目选项)之外,还要在运行时请求后者,以便用户可以随时撤回它们。我们需要权限:CAMERA,READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE ; 也就是说,访问摄像机并允许读写移动设备的外部存储器。同样,您必须在权限列表中将Secure Data Sharing项设置为true。

然后我们切换到表单的源代码。它是关于在运行时检查适当的权限。我们为授权的描述定义了三个私有变量,具体来说:

FPermissionReadExternalStorage:string; 

FPermissionWriteExternalStorage:string; 

FPermissionCamera:string;

在表单的Create事件中 - 通过Object Inspector创建它 - 初始化权限。其工作原理如下:

程序TForm1.FormCreate(发件人:TObject); 

开始

{$ IFDEF ANDROID} 

  FPermissionReadExternalStorage:= JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE); 

  FPermissionWriteExternalStorage:= JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE); 

  FPermissionCamera:= JStringToString(TJManifest_permission.JavaClass.CAMERA); 

{$ ENDIF} 

结束;

包含在{$ IFDEF ANDROID} ... {$ ENDIF}中可确保仅为Android处理此源代码(条件编译)。

此外,根据以下模式创建两个私有过程:

procedure MakePicturePermissionRequestResult(Sender:TObject; const APermissions:TArray <string>; 

  const AGrantResults:TArray <TPermissionStatus>); 

procedure DisplayRationale(Sender:TObject; const APermissions:TArray <string>; const APostRationalProc:TProc);

MakePicturePermissionRequestResult(...)过程负责在运行时确切地在需要时检查权限。在我们的例子中,如果用户想要**相机。过程DisplayRationale(...)在必要时通知用户有关授权请求的原因。单击按钮即可触发具体授权。为此,请通过对象按钮的对象检查器绑定OnClick事件,然后输入以下代码:

程序TForm1.Button1Click(发件人:TObject); 

开始

  PermissionsService.RequestPermissions([FPermissionReadExternalStorage,FPermissionWriteExternalStorage,FPermissionCamera]请图片请求许可结果,显示理由)

端;

作为解释:我们请求上述授权并将这两个过程作为所谓的回调方法传递。让我们来看看MakePicturePermissionRequestResult(...)过程的实现

TForm1.MakePicturePermissionRequestResult程序(发信人:TObject的;常量APermissions:在tarray; 

const的AGrantResults:在tarray); 

开始

 ,如果(长度(AGrantResults)= 3)和(AGrantResults [0] = TPermissionStatus.Granted)和(AGrantResults [1] = TPermissionStatus.Granted)和(AGrantResults [2] = TPermissionStatus.Granted)然后TakePhotoFromCameraAction1.Execute别的TDialogService。 ShowMessage('没有授予摄像头访问权限。')结束;

数组AGrantResults存储授权检查的结果。仅当用户已经授予所有请求的授权时,才触发上述标准动作,即通过摄像机**图像。这是通过调用TakePhotoFromCameraAction1.Execute来完成的。在否定的情况下,用户接收拒绝访问的指示。该程序显示理性(...)包含以下代码:

procedure TForm1.DisplayRationale(Sender:TObject; const APermissions:TArray <string>; const APostRationalProc:TProc); 

 开始

  TDialogService.ShowMessage('应用程序想要使用相机。',

   程序(const AResult:TModalResult)

   开始

    APostRationaleProc; 

   结束)

结束; 

这样就完成了Android的授权检查。

在这种情况下,请注意以下内容:几乎整个源代码都归因于Android的授权检查,这是API级别26的强制性要求。该功能的编程,即相机的使用可以在Delphi的设计者中完全实现,并且图像资源的分配仅包括一行源代码。

启动应用

切换回Delphi Designer并启用Android作为目标平台。

Android视图中Delphi中的用户界面预览。

确保您可以访问移动设备。构建应用程序并在移动设备上运行它。片刻之后,它应该从智能手机/平板电脑开始。现在,您只需单击按钮即可使用内置摄像头拍摄照片,然后会立即在应用程序中显示。

分享所有(分享内容)

用相机拍摄的图像可以通过不同的服务分发。这些包括电子邮件; Messenger服务,例如WhatsApp或上传到Dropbox等云存储。同样,我们不必手动编程每个功能,但可以使用操作系统的相应服务以及采用标准操作。我们马上尝试一下:

在工具栏中添加一个新按钮。对于此功能,我们无需在Android上请求特殊权限。我们将按钮(属性文本)标记为“ 共享... ”。(你也可以在这里使用标准图标!)

添加按钮以共享内容。

通过按钮的Action属性,我们创建了一个类型为TShowShareSheetAction的新标准动作。在树视图中,我们选择操作并转到Events选项卡中的Object Inspector 。

选择和配置标准操作。

在我们的例子中,名称是ShowShareSheetAction1,我们绑定事件OnBeforeExecute,即双击我们生成相应的过程。我们自动登陆代码编辑器并在事件中捕获以下代码。

procedure TForm1.ShowShareSheetAction1BeforeExecute(Sender:TObject); 

开始

 ShowShareSheetAction1.Bitmap.Assign(Image1.Bitmap); 

结束;

这会导致当前图像资源传递到Image1组件以进行共享。这就是源代码级别。一些绑定和非常少的源代码。在连接的智能手机或平板电脑上启动应用 使用应用程序的相机功能拍照,然后单击“ 共享”按钮。出现一个选择框,将资源(此处为图片)传输到其他服务。例如,在Android上它可能如下所示:

分享图片。这是Android的选择对话框。

例如,如果选择电子邮件客户端(Outlook,Yahoo,...),操作系统会自动生成新电子邮件并将图像作为附件插入。

注意:此功能还允许将其他内容(如文本)转发到服务。

简介:这些非常需要和使用的应用程序功能也可以使用Delphi中的标准操作和最少代码来实现。 

结论和展望

在本教程的第二部分中,您已经看到为Android和iOS移动系统实现应用程序是多么容易。通过使用用户界面的组件,可以快速创建并吸引人。非可视组件封装了系统的功能,开发人员可以针对统一的界面进行编程。用户界面的各个块之间的程序逻辑主要由动作决定(动作)相连接。使用标准操作可以显着减少编码所需的工作量。通过简单地在平台之间切换,可以以这种方式为所有支持的系统部署应用程序。最大的优势:应用程序的开发时间可以显着减少。

本教程中显示的功能只是Delphi为移动平台创建高质量,丰富且适合应用程序的应用程序的一小部分。要使用Delphi进一步开发应用程序,我们建议您阅读以下来源:http//docwiki.embarcadero.com/RADStudio/Rio/en/Main_Page

为进一步阅读,我们建议:

最后说明:您可以此处下载本教程的两个部分的源代码。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap