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
相关产品推荐
相关产品推荐

