Delphi XE10 TNotificationCenter 发送通知消息后调用摄像头拍照时APP卡死

在Delphi XE10的项目中,当使用TNotificationCenter发送通知消息后调用摄像头拍照,应用程序有时会卡死。经过排查,问题与TNotificationCenter的使用有关,但具体原因未知。解决方法是避免在拍照前发送通知消息,改用ShowMessage作为替代。此问题在禁用TNotificationCenter或不拍照时不会出现。
摘要由CSDN通过智能技术生成

1. 背景说明

嗯...还是之前的APP, 拖了很久的一个迷bug: 调用摄像头进行拍照时"偶然"会出现APP卡死.

Delphi版本: Delphi 10 Seattle

Delphi的界面框架: OrangeUI 1.67 Seattle

 (应该跟这个框架没有关系, 这里只是为了尽量描述详细一些)

 

2. 原因

由于问题发现的比较晚, 整个APP都开发完成后才发现...

所以只好各种屏蔽代码来排查问题...

最后发现: 调用了Delphi提供的TNotificationCenter 对象发送通知消息后, 再调用摄像头进行拍照时, 就会出现卡死的情况.

当然, 最根本的原因是什么, 并没有找到...我也不想找了...


3. 解决方法

要么不拍照, 要么不用TNotificationCenter 发送通知消息了...

这个项目中, 不拍照是不可能的, 但是对TNotificationCenter 发送通知消息的要求不高...

最后换成了ShowMessage...(好在客户好说话, 就这样草草接受了)...


4. 详细描述

a. 我在主页面(frmMain)添加了一个TNotificationCenter 对象, 用于在某件事件触发时, 发出系统通知消息.

b. 然后创建了一个公共的方法来调用这个对象:

// 发送通知
class procedure TUtilsClass.Notify(szBody: String);
var
  notify: TNotification;
begin
  // 关闭通知时, 退出
  if G_TITLE_BAR_PROMPT = false then
    exit;

  // 目前通知信息内容是一样的, 所以发
Delphi是一种支持多平台开发的集成开发环境(IDE),可以开发多种操作系统和设备的应用程序。而Android是一种开放平台的操作系统,用于移动设备。 在Delphi中,可以使用FireMonkey框架来开发Android应用程序,并通过调用Android的相机摄像头拍照。 首先,需要在Delphi中创建一个新的FireMonkey移动应用程序项目。然后,通过添加一个按钮和一个图片控件来实现拍照功能。在按钮的Click事件中,编写代码来调用照相机摄像头。 在代码中,可以使用TAndroidCameraComponent组件来访问Android设备的摄像头功能。需要使用TBitmap类型的变量来存储拍摄的照片。 以下是示例代码: uses FMX.MediaLibrary, FMX.Types, FMX.Media; procedure TForm1.Button1Click(Sender: TObject); var Camera: TCameraComponent; begin Camera := TCameraComponent.Create(Self); Camera.Kind := TCameraKind.BackCamera; // 设置使用后置摄像头 Camera.Active := True; Camera.TakePhoto; // 调用拍照功能 // 在照片拍摄完成后,将其保存到TBitmap变量 while Camera.WaitingForPermission do Application.ProcessMessages; if Camera.HasPermission then begin CameraSample.BeginUpdate; try if Camera.SampleBufferToBitmap(Camera.SampleBuffer, CameraSample.Bitmap) then begin CameraSample.Bitmap.SaveToFile('path/to/save/image.jpg'); // 将照片显示到图片控件上 Image1.Bitmap.Assign(CameraSample.Bitmap); end; finally CameraSample.EndUpdate; end; end; Camera.Active := False; Camera.DisposeOf; end; 通过以上代码,可以在Delphi中调用Android的照相机摄像头,并将拍摄的照片保存到指定路径,并显示在图片控件上。当然,你可以根据需求自行修改代码,添加图片预览、处理等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值