提示:不要忘记在Delphi工程Option选项中开启SEND SMS颈椎枕权限!欢迎加入Delphi开发局QQ群:32422310
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.