小米Android12设备上Delphi应用TakePhotoAction崩溃重启求助
Delphi Android小米设备拍照后应用重启问题及Bitmap回调获取求助
环境
- Delphi 12.2(最新SP版本)
- 适配Android和iOS的跨平台应用
- 测试硬件:Pixel 7a(Android 15)/小米Redmi(Android 12 SP1)
问题描述
仅小米设备出现该问题(其他品牌未测试),Pixel设备运行正常。项目流程为:先从API接口加载数据到本地SQLite数据库,再拍摄照片并与下载的数据关联保存。调用拍照的代码与Embarcadero官方示例完全一致:
procedure TPhotoForm.TakePicture(Sender: TObject); begin if TOSVersion.Check(11) then ActionTakePhotoFromCamera.Execute; end;
问题表现:调用拍照方法后系统相机正常打开,拍摄并选择照片触发OnFinishTakingPicture事件时,应用无报错直接重启。该问题并非每次出现:重试3-4次或重启应用后可正常工作,直到再次重启应用。稳定复现步骤:
- 卸载应用
- 重新安装
- 首次启动时拍摄照片,必现崩溃重启
已排查内容
- 权限配置:对比官方示例更新Android清单和权限,确认使用系统相机对话框无需相机权限,但问题仍存在。
- FMX代码追踪:跟踪
TAction.TakePhoto至FMX.MediaLibrary.Android,检查TImageManagerAndroid.TakePhoto和TImageManagerAndroid.TPhotoActivityResponseListener.onResponse方法,未发现明显异常。 - 电池优化:禁用应用所有电池优化设置,问题仍存在。
补充发现与求助
问题根源锁定为小米内存优化机制:当应用内存占用在150-450MB时,打开系统相机后应用进入后台,可能被系统挂起;内存占用超过500MB时必现崩溃,甚至官方示例也能复现该问题。
官方示例中启动窗体包含ActionList,应用重启后可通过OnFinishEvent获取回调,但我的应用中启动窗体与调用拍照的窗体不是同一个,求助在此场景下如何正确获取拍摄的Bitmap?相关核心代码如下:
try LConverted := JBitmapToBitmap(LNativeBitmap, LBitmap); LNativeBitmap.recycle; if LConverted then begin if Assigned(LParams.OnDidFinishTaking) then begin log.d('OnDidFinishTaking is Assigned'); LParams.OnDidFinishTaking(LBitmap) end else begin log.d('OnDidFinishTaking is not Assigned'); LRequestKind := response.getRequestKind; if LRequestKind.equals(TJPhotoActivityRequestKind.JavaClass.PICK) then TMessageManager.DefaultManager.SendMessage(Self, TMessageDidFinishTakingImageFromLibrary.Create(LBitmap)) else if LRequestKind.equals(TJPhotoActivityRequestKind.JavaClass.TAKE) then TMessageManager.DefaultManager.SendMessage(Self, TMessageDidFinishTakingImageFromCamera.Create(LBitmap)); end; end; finally LBitmap.Free; end;
内容的提问来源于stack exchange,提问作者fisi-pjm
相关产品推荐
相关产品推荐

