为什么我的Android应用程序只需点击一下即可拍照?

问题描述 投票:0回答:1

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

android delphi photo
1个回答
1
投票

从代码中删除所有“绒毛”,我想出了这个:

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的任何变化可以解释差异。

© www.soinside.com 2019 - 2024. All rights reserved.