Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

Delphi FMX 안드로이드 앱 런타임 퍼미션 수행 샘플 프로젝트 및 데모


Recommended Posts

* 본 게시글의 내용은 안드로이드 및 Rad Studio 버전 업데이트에 따른 환경 변화에 따라 정상 실행이 안될 수도 있습니다.

게시글를 작성하는 싯점 (2022.09.23) 에서의 프로젝트 환경은 다음과 같습니다.

프로젝트 환경 : 안드로이드 12 버전  /  Rad Studio Delphi 11.2 

image.png

 

런타임 퍼미션을 실행하기 위해서는 해당 퍼미션의 항목을 확인하고 프로젝트 옵션에서 체크 합니다.

본 데모 프로젝트에서는 Location, Call(전화걸기), Camera의 3가지 항목을 앱이 실행되는 런타임 싯점에 앱 사용자로 부터 허가 받습니다.

각각 화면에서 버튼을 누르는 싯점에 퍼미션을 받게 하였으므로 앱 개발시 필요한 싯점에 해당 메소드를 호출 하면 됩니다.

기타 내용은 본문 소스 및 데모 동영상을 참고 하시기 바랍니다.

데모 프로젝트는 델파이 설치시 기본 제공 되는 아래 경로의 샘플을 참고 하여 제작 하였습니다.

c:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Object Pascal\Multi-Device Samples\Media\PhotoEditorDemo\

 

unit PMUnit;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,  System.Permissions,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure DisplayRationale(Sender: TObject; const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);
    procedure Loacation_PermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray;
      const AGrantResults: TClassicPermissionStatusDynArray);
    procedure Call_PermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray;
      const AGrantResults: TClassicPermissionStatusDynArray);
    procedure Camera_PermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray;
      const AGrantResults: TClassicPermissionStatusDynArray);
    { Private declarations }
  public
    { Public declarations }
    FPermissionLoacation, FPermissionCall, FPermissionCamera : string;
  end;

var
  Form1: TForm1;

implementation

uses
{$IFDEF ANDROID}
   Androidapi.JNI.Os,
   Androidapi.Helpers,
   AndroidApi.Jni.JavaTypes,
   FMX.DialogService;
{$ENDIF}


{$R *.fmx}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FPermissionLoacation := JStringToString(TJManifest_permission.JavaClass.ACCESS_FINE_LOCATION );
  FPermissionCall      := JStringToString(TJManifest_permission.JavaClass.CALL_PHONE );
  FPermissionCamera    := JStringToString(TJManifest_permission.JavaClass.CAMERA );
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
  PermissionsService.RequestPermissions([FPermissionLoacation], Loacation_PermissionRequestResult, DisplayRationale);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  PermissionsService.RequestPermissions([FPermissionCall], Call_PermissionRequestResult, DisplayRationale);
end;


procedure TForm1.Button3Click(Sender: TObject);
begin
  PermissionsService.RequestPermissions([FPermissionCamera], Camera_PermissionRequestResult, DisplayRationale);
end;

procedure TForm1.DisplayRationale(Sender: TObject; const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);
var
  I: Integer;
  RationaleMsg: string;
begin
  for I := 0 to High(APermissions) do
  begin
    if APermissions[I] = FPermissionLoacation then
      RationaleMsg := RationaleMsg + 'The app needs to access the Permission Location' + SLineBreak + SLineBreak

    else if APermissions[I] = FPermissionCall then
      RationaleMsg := RationaleMsg + 'The app needs to access the Permission Call' + SLineBreak + SLineBreak

    else if APermissions[I] = FPermissionCamera then
      RationaleMsg := RationaleMsg + 'The app needs to access the Permission Camera';

  end;

  // Show an explanation to the user *asynchronously* - don't block this thread waiting for the user's response!
  // After the user sees the explanation, invoke the post-rationale routine to request the permissions
  TDialogService.ShowMessage(RationaleMsg,
    procedure(const AResult: TModalResult)
    begin
      APostRationaleProc;
    end)
end;


procedure TForm1.Loacation_PermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
begin
  // 3 permissions involved: CAMERA, READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE
//  if (Length(AGrantResults) = 3) and
//     (AGrantResults[0] = TPermissionStatus.Granted) and
//     (AGrantResults[1] = TPermissionStatus.Granted) and
//     (AGrantResults[2] = TPermissionStatus.Granted) then

  if ( Length(AGrantResults) = 1) and
     (AGrantResults[0] = TPermissionStatus.Granted) then
    TDialogService.ShowMessage('Location permissions OK ' )
  else
    TDialogService.ShowMessage('The required permissions are not granted');
end;


procedure TForm1.Call_PermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
begin
  if ( Length(AGrantResults) = 1) and
     (AGrantResults[0] = TPermissionStatus.Granted) then
    TDialogService.ShowMessage('Call permissions OK ' )
  else
    TDialogService.ShowMessage('The required permissions are not granted');
end;

procedure TForm1.Camera_PermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
begin
  if ( Length(AGrantResults) = 1) and
     (AGrantResults[0] = TPermissionStatus.Granted) then
    TDialogService.ShowMessage('Camera permissions OK ' )
  else
    TDialogService.ShowMessage('The required permissions are not granted');
end;



end.

 

이 댓글 링크
다른 사이트에 공유하기

  • 1 month later...

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.