2022년 9월 22일 목요일

Delphi FMX Android run time permission sample project demo

 



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.

2022년 6월 22일 수요일

[FMX] Firemonkey delphi android beep sound

 Uses

   Androidapi.Helpers,

   Androidapi.JNIBridge,

   Androidapi.JNI.Media,

   AndroidApi.Jni.JavaTypes,

   AndroidApi.Jni.App;


procedure BeepSound();

{$IFDEF ANDROID}

var

  AudioObj: JObject;

  Audio: JAudioManager;

{$ENDIF}

begin

{$IFDEF ANDROID}

  AudioObj:= TAndroidHelper.Activity.getSystemService( TJActivity.JavaClass.AUDIO_SERVICE);

  Audio := TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID);

  Audio.loadSoundEffects;

  Audio.playSoundEffect( 8 );  // 0 ~ 9 

{$ENDIF}

end;


2022년 6월 14일 화요일

[TMS] Introduction of TAdvStringGrid function - How to link to cell and use balloon help


TAdvStringGrid 의 cell 항목에 외부링크를 연결하여 웹브라우저를 호출 할 수 있고
Grid 내부에서 특정셀로 이동하도록 하는 링크를 넣을 수 있습니다.
하단 샘플 소스와 같이 하이퍼링크 방식의 텍스트를 입력 합니다


풍선 도움말은 TAdvStringGrid 의 Balloon 옵션의 Enable를 TRUE 로  먼저 설정 해야 합니다.
옵션 항목 중 ShowCell 항목은 입력된 데이터도 풍선 도움말로 보여주므로 불 필요시 FALSE 로 지정 하면 됩니다.
AddBalloon 메소드를 사용하여 필요한 메시지를 입력 하면 됩니다.


 with AdvStringGrid1 do begin
      Cells[2, 2] := '<A href="http://www.devgear.co.kr">Click here</A><BR>for more';    // 웹페이지 연결
      Cells[2, 3] := '<A href="CELL://R8C1">Link to cell 1,8</A>';                       // 특정 셀로 이동
      Cells[1, 8] := '<A href="CELL://R3C2">Link to cell 2,3</A>';                       // 특정 셀로 이동

      AddBalloon(1,1,'Title A','Cell 1,1 is here', biError);     //   TBalloonIcon = (biNone, biInfo, biWarning, biError);
      AddBalloon(3,3,'Title B','Cell 3,3 is here', biWarning);
   end;