You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中TTakePhotoFromCameraAction在Android API33下授权后崩溃求助

Delphi Android API33下TTakePhotoFromCameraAction授权相机后崩溃问题

我在Delphi中使用TTakePhotoFromCameraAction组件,通过Android原生弹窗申请相机权限,点击“允许”后应用在API33版本下直接崩溃。已尝试添加READ_MEDIA_IMAGES等媒体权限,但问题仍未解决。

相关代码

procedure TFormModuleCreationFraisDivers.btnTakePictureClick(Sender: TObject);
begin
  // 申请拍摄照片所需权限
  PermissionsService.RequestPermissions([PERM_CAMERA], PermissionRequestResult, DisplayRationale);
end;

procedure TFormModuleCreationFraisDivers.PermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
var perm: TPermissionStatus;
begin
  for perm in AGrantResults do
    if perm <> TPermissionStatus.Granted then
    begin
      ShowMessage('Les autorisations requises n''ont pas étés accordées');
      Exit;
    end;

  actTakePic.Execute
end;

procedure TFormModuleCreationFraisDivers.DisplayRationale(Sender: TObject; const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);
var msg: string;
begin
  msg := '需要相机权限以拍摄照片';
  TDialogService.ShowMessage(msg, procedure(const AResult: TModalResult)
  begin APostRationaleProc; end);
end;

Manifest配置

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

曾尝试添加以下权限,但无效:

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />

问题分析与解决方案

1. 补充Manifest配置

Android API33下,除相机权限外,需添加相机特性声明及兼容低版本的存储权限:

<!-- 声明相机硬件特性 -->
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<!-- 兼容API32及以下的存储写入权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

2. 确保在UI线程执行相机Action

PermissionRequestResult回调可能在非UI线程触发,直接调用actTakePic.Execute会导致崩溃,需切换到UI线程执行:

procedure TFormModuleCreationFraisDivers.PermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
var perm: TPermissionStatus;
begin
  for perm in AGrantResults do
    if perm <> TPermissionStatus.Granted then
    begin
      ShowMessage('Les autorisations requises n''ont pas étés accordées');
      Exit;
    end;

  // 切换至UI线程执行相机操作
  TThread.Synchronize(nil, procedure
  begin
    actTakePic.Execute;
  end);
end;

3. 检查存储路径配置

API33下,应用公共目录写入需通过MediaStore,而TTakePhotoFromCameraAction若保存到私有目录则无需额外权限。确保保存路径指向应用私有存储:

// 在Form创建或初始化时设置
actTakePic.SaveToFile := TPath.Combine(TPath.GetDocumentsPath, 'temp_photo.jpg');

4. 更新Delphi版本

Embarcadero在后续版本中修复了Android 13的兼容性问题,建议升级到Delphi 11.3及以上版本。


内容的提问来源于stack exchange,提问作者Test Account

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:52:50