我写了一个Delphi 10.3 CE多设备应用程序,它使用一个按钮来拍照。我使用的代码就是这个(简单):
unit uFormes;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.TabControl,
FMX.StdCtrls, FMX.Gestures, FMX.TreeView, FMX.Layouts, FMX.Controls.Presentation,
FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base, FMX.ListView,
System.Rtti, FMX.Grid.Style, FMX.Grid, FMX.ScrollBox, FMX.ListBox, FMX.Edit,
FMX.Memo, Data.DB, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdHTTP, FMX.EditBox, FMX.NumberBox, FMX.text, System.Sensors, System.Sensors.Components,
FMX.ExtCtrls, System.ImageList, FMX.ImgList, FMX.Objects, System.Actions,
FMX.ActnList, FMX.StdActns, FMX.MediaLibrary.Actions, System.Permissions;
type
TTabbedForm = class(TForm)
TabControl1: TTabControl;
TabItem1: TTabItem;
TabItem2: TTabItem;
GestureManager1: TGestureManager;
CornerButton1: TCornerButton;
ActionList1: TActionList;
TakePhotoFromCameraAction1: TTakePhotoFromCameraAction;
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
procedure PermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
procedure DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
public
{ Public declarations }
end;
var
TabbedForm: TTabbedForm;
implementation
uses
{$IFDEF ANDROID}
Androidapi.JNI.JavaTypes,
Androidapi.JNI.Net,
Androidapi.JNI.GraphicsContentViewText,
FMX.Helpers.Android,
Androidapi.JNIBridge,
Androidapi.Helpers,
Androidapi.JNI.Os
{$ENDIF}
FMX.Consts,
FMX.Platform,
FMX.VirtualKeyboard,
EncdDecd,
System.IOUtils,
inifiles,
FMX.DialogService;
{$R *.fmx}
procedure TTabbedForm.PermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
begin
// 3 permission involved
if (Length(AGrantResults) = 3)
and (AGrantResults[0] = TPermissionStatus.Granted)
and (AGrantResults[1] = TPermissionStatus.Granted)
and (AGrantResults[2] = TPermissionStatus.Granted) then
else
ShowMessage('δεν έχει δοθεί άδεια') ;
end;
procedure TTabbedForm.DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
begin
TDialogService.ShowMessage('πρέπει να χρησιμοποιηθεί η κάμερα',
procedure(const AResult: TModalResult)
begin
APostRationaleProc;
end);
end;
procedure TTabbedForm.FormCreate(Sender: TObject);
var
permCam, permRead, permWrite: string;
begin
// Request permissions
permCam := JStringToString(TJManifest_permission.JavaClass.CAMERA);
permRead := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE);
permWrite := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);
PermissionsService.RequestPermissions([permCam, permRead, permWrite], PermissionRequestResult, DisplayRationale);
end;
procedure TTabbedForm.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
begin
Image1.Bitmap.Assign(Image);
end;
end.
每次我按下按钮,我都注意到我的手机拍了两张照片(一张约300KB,一张约7 MB)。这不是手机的问题,因为我测试了手动并且只拍了一次。
从代码中删除所有“绒毛”,我想出了这个:
type
TForm1 = class(TForm)
ActionList1: TActionList;
Button1: TButton;
TakePhotoFromCameraAction1: TTakePhotoFromCameraAction;
Image1: TImage;
procedure TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
procedure FormCreate(Sender: TObject);
private
procedure PermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.FormCreate(Sender: TObject);
begin
TPermissionsService.DefaultService.RequestPermissions(['android.permission.CAMERA', 'android.permission.READ_EXTERNAL_STORAGE',
'android.permission.WRITE_EXTERNAL_STORAGE'], PermissionRequestResult);
end;
procedure TForm1.PermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
begin
// Not checking the result because I know I will accept
end;
procedure TForm1.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
begin
Image1.Bitmap.Assign(Image);
end;
使用它(和权利中启用的安全文件共享),当我单击附加了操作的按钮时,它最终会在我的照片中准确显示一个图像。这是使用Delphi 10.3.1和Nexus 5X与Android 9.我不记得10.3的任何变化可以解释差异。