RAD Studio [my sample] How to send SMS message using Intent / Activity Java Class and Android Permissions in Delphi

emailx45

Местный
Регистрация
5 Май 2008
Сообщения
3,571
Реакции
2,438
Credits
573
[my sample] How to send SMS message using Intent / Activity Java Class and Android Permissions in Delphi
Me, May/2020
[SHOWTOGROUPS=4,20]
1588700964921.png
Image: Googleplay

NOTE: DONT FORGET mark the SEND SMS permission in your project options!

Код:
unit uFormMain;

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
  TfrmFormMain = class(TForm)
    btnSendSMS: TButton;
    procedure btnSendSMSClick(Sender: TObject);
  private
{$IFDEF ANDROID}
    procedure myPRREsulted(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
    procedure myDRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
{$ENDIF}
  public
    { Public declarations }
  end;

var
  frmFormMain: TfrmFormMain;

implementation

{$R *.fmx}

uses
  FMX.DialogService,
  System.IOUtils,
{$IF DEFINED(ANDROID)}
  Androidapi.JNI.JavaTypes,
  Androidapi.Helpers,
  Androidapi.JNI.Net,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.Support,
  Androidapi.JNI.Os,
  Androidapi.JNI.App
{$ENDIF}
    ;

var
  FPermissionSEND_SMS: string;

{$IFDEF ANDROID}

procedure CreateSms(const Number, Msg: string);
var
  lMyIntent: JIntent;
  lMyUri   : Jnet_Uri;
begin
  try
    lMyUri := TJnet_Uri.JavaClass.parse(StringToJString(Format('smsto:%s', [Number])));
    //
    lMyIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, lMyUri);
    //
    lMyIntent.putExtra(StringToJString('sms_body'), StringToJString(Msg));
    //
    TAndroidHelper.Activity.startActivity(lMyIntent);
    // SharedActivity.startActivity(lMyIntent);  // deprecated in RAO 10.3.3
    //
    // TDialogService.ShowMessage('For tests: Confirm the message and press key to send it!');
  except
    on E: Exception do
      TDialogService.ShowMessage('My error:' + sLineBreak + E.Message);
  end;
end;

procedure TfrmFormMain.btnSendSMSClick(Sender: TObject);
begin
{$IFDEF ANDROID}
  // Asking permission to access "YOUR NECESSITY" in your Android...
  // FPermissionWifiState: string; defined in "uMyFunctionsAndroid" unit!
  //
  PermissionsService.RequestPermissions( { }
    [FPermissionSEND_SMS],        { <--- ... I need this permission }
    myPRREsulted,                        { PermissionsRequestResult{ <-- callback function to each permission }
    myDRationale                         { DisplayRationale }{ <-- to show the message for each permission - Always Non-Modal!!! }
    );
{$ELSE}
  ShowMessage('Hello word');
{$ENDIF}
end;

procedure TfrmFormMain.myDRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
var
  i            : Integer;
  lRationaleMsg: string;
begin
  for I := 0 to high(APermissions) do
  begin
    if APermissions[I] = FPermissionSEND_SMS then
      lRationaleMsg := lRationaleMsg + 'The app needs to access your "<<SEND_SMS>>"' + SLineBreak + SLineBreak;
  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(lRationaleMsg,
    procedure(const AResult: TModalResult)
    begin
      // TProc is defined in System.SysUtils
      //
      APostRationaleProc; // used by System to go-back in before function...
    end)
end;

procedure TfrmFormMain.myPRREsulted(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
begin
  // verifying permissions
  if (Length(AGrantResults) = 1) and               { }
    (AGrantResults[0] = TPermissionStatus.Granted) { }
  then
    CreateSms('<<PHONE_NUMBER_TARGET_HERE', 'SMS_MESSAGE_HERE') { execute your procedure here if all it's ok }
  else
    TDialogService.ShowMessage('Permissions <<NECESSARY>> and not allowed by user');
end;
{$ENDIF}

initialization

{$IFDEF ANDROID}
//
FPermissionSEND_SMS := JStringToString(TJManifest_permission.JavaClass.SEND_SMS);
{$ENDIF}

finalization

end.
[/SHOWTOGROUPS]