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>