c2design 9월 23일, 2022에 포스트됨 공유하기 9월 23일, 2022에 포스트됨 * 본 게시글의 내용은 안드로이드 및 Rad Studio 버전 업데이트에 따른 환경 변화에 따라 정상 실행이 안될 수도 있습니다. 게시글를 작성하는 싯점 (2022.09.23) 에서의 프로젝트 환경은 다음과 같습니다. 프로젝트 환경 : 안드로이드 12 버전 / Rad Studio Delphi 11.2 런타임 퍼미션을 실행하기 위해서는 해당 퍼미션의 항목을 확인하고 프로젝트 옵션에서 체크 합니다. 본 데모 프로젝트에서는 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. 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
c2design 10월 28일, 2022에 포스트됨 Author 공유하기 10월 28일, 2022에 포스트됨 전화걸기 기능이 추가된 샘플 입니다. 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.