Delphi 10.4.2でAndroidカメラ機能を実装する際のトラブル対応

Delphi 10.4.2ではAndroid 11への公式サポートが実装されていますが、Android側の仕様変更に伴いカメラ機能の実装で特定の問題が発生します。これはDelphi自体の不具合ではなく、Androidの変化に対応する実装方法の理解が必要な点に起因します。特にカメラ撮影後に画像が表示されない問題が報告されており、その解消方法を技術的に整理します。

カメラアクションの実装

Delphiではカメラ機能が標準アクションとして提供されています。TActionListにTTakePhotoFromCameraActionを追加し、撮影結果の処理を実装します。
procedure TCameraForm.CameraActionDidFinish(Image: TBitmap); begin // キャプチャ画像をTImageコンポーネントに表示 imgCapture.Bitmap.Assign(Image); end;

動的権限要求処理

Androidのセキュリティ要件に応じて、実行時に必要な権限を動的に要求する必要があります。
procedure TCameraForm.RequestCameraPermissions; begin PermissionsService.RequestPermissions([ StringOf(JManifest_permission.JavaClass.CAMERA), StringOf(JManifest_permission.JavaClass.READ_EXTERNAL_STORAGE), StringOf(JManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE) ], HandlePermissionResult, ShowRationale); end; procedure TCameraForm.ShowRationale( const APermissions: TArray; const APostRationaleProc: TProc); var rationale: string; begin rationale := 'カメラ機能を使用するには外部ストレージへのアクセスが必要です'; TDialogService.ShowMessage(rationale, procedure begin APostRationaleProc; end); end; procedure TCameraForm.HandlePermissionResult( const APermissions: TArray; const AGrantResults: TArray); begin if (Length(AGrantResults) = 3) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) and (AGrantResults[2] = TPermissionStatus.Granted) then begin TakePhotoFromCameraAction.Execute; end else begin TDialogService.ShowMessage('必要な権限が取得できませんでした'); end; end;

AndroidManifest設定

Android 10以降のストレージアクセス制限に対応するため、以下の設定をAndroidManifest.template.xmlに追加する必要があります。
<manifest> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:requestLegacyExternalStorage="true"> </application> </manifest>

プロジェクト設定

プロジェクトオプションで「セキュアファイル共有」を有効にすることも必須です。これはAndroidのScoped Storage仕様に対応するための措置で、ファイル共有機能を正しく動作させるために必要です。

移行時の注意点

10.3.3以前のバージョンからの移行プロジェクトでは、Android 11のストレージアクセス制限により、明示的にlegacyExternalStorageをtrueに設定する必要があります。この設定を忘れると、ファイル作成権限エラーが発生します。 これらの設定と実装を適切に行うことで、Delphi 10.4.2でのAndroidカメラ機能を安定して動作させることができます。

タグ: Delphi Android カメラ権限 AndroidManifest.xml Scoped Storage

5月26日 21:39 投稿