为什么我的 android 应用程序一键拍照?

Why my android application takes to photo with one clik?

我写了一个 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,一张大约 7MB)。这不是手机的问题,因为我测试了手动并拍了一张。

从您的代码中删除所有 "fluff",我想出了这个:

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 和带有 Android 9 的 Nexus 5X。我不记得从 10.3 开始有任何变化可以解释差异。