Delphiでお手軽プログラミング

Delphiでお手軽プログラミングメニュー

DelphiでSMS送信するAndroidアプリケーションを作る

~SMS送信するAndroidアプリケーションを作成します。



1.フォームの作成

FMXフレームワークで以下のようにフォームにTButtonを1つ配置します。

2.ソースコード

実際にSMS送信を行うのは、Button1Click関数の4行だけです。
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
      Shift: TShiftState);
    procedure FormCreate(Sender: TObject);
  private
    { private 宣言 }
    function AppEvent(AppEvent:TApplicationEvent; Context:TObject):Boolean;
    procedure RequestPermissions();
    procedure PermissionRequestResult(Sender: TObject;
      const APermissions: TArray<string>;
      const AGrantResults: TArray<TPermissionStatus>);
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}
uses
      //StringToJString JStringToString TAndroidHelper
   Androidapi.Helpers
      //TJManifest_permission
  ,Androidapi.JNI.Os
      //TJActivityCompat
  ,Androidapi.Jni.Support
      //TDialogService
  ,FMX.DialogService
      //JString
  ,Androidapi.JNI.JavaTypes
      //JSmsManager TJSmsManager
  ,Androidapi.JNI.Telephony ;


function TForm1.AppEvent(AppEvent:TApplicationEvent; Context:TObject): Boolean;
begin
  Result:=False;
  case AppEvent of
    TApplicationEvent.BecameActive:
    begin
      //アプリがフォーカス取得時
    end;
    TApplicationEvent.WillBecomeInactive:
    begin
      //アプリがフォーカス喪失時
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var smsTo: JString;
    smsManager: JSmsManager;
    smsMsg:JString;
begin
  smsManager := TJSmsManager.JavaClass.getDefault;
  //SMS送信先電話番号を設定する
  smsTo := StringToJString('09000000000');
  //SMS送信メッセージを設定する
  smsMsg:= StringToJString('ここに'+#13+#10+'メッセージ本文を入力');
  smsManager.sendTextMessage(smsTo, nil, smsMsg, nil, nil);
end;

procedure TForm1.FormCreate(Sender: TObject);
var APPEventService:IFMXApplicationEventService;
begin
  if TPlatformServices.Current.SupportsPlatformService(
       IFMXApplicationEventService) then
  begin
    try
      APPEventService:=IFMXApplicationEventService(
        TPlatformServices.Current.GetPlatformService(
          IFMXApplicationEventService ) );
    except
      APPEventService:=nil;
    end;
  end;
  if (APPEventService <> nil) then
    APPEventService.SetApplicationEventHandler(AppEvent);
  RequestPermissions();
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
begin
  if Key = vkHardwareBack then Key := 0;
end;

procedure TForm1.PermissionRequestResult(Sender: TObject;
  const APermissions: TArray<string>;
  const AGrantResults: TArray<TPermissionStatus>);
begin
  //SMS送信権限があるか
  if (AGrantResults[0] <> TPermissionStatus.Granted) then
  begin
    //SMS送信権限がない場合
    //「□今後は表示しない」チェックボックスにチェックが入っているか
    if (TJActivityCompat.JavaClass.shouldShowRequestPermissionRationale(
         TAndroidHelper.Activity,TJManifest_permission.JavaClass.SEND_SMS)) then
    begin
      //「□今後は表示しない」チェックボックスにチェックが入っていない場合
      // 非同期でダイアログを表示して説明と許可を要求
      TDialogService.MessageDialog(
        '許可しないとアプリが動作しません。',
        TMsgDlgType.mtInformation, [TMsgDlgBtn.mbOK],TMsgDlgBtn.mbOk, 0,
        procedure (const AResult: TModalResult)
        begin
          //2回目以降は「□今後は表示しない」チェックボックスが表示される
          RequestPermissions();
        end
      );
    end
    else
    begin
      //「□今後は表示しない」チェックボックスにチェックが入っている
      TDialogService.MessageDialog(
        '権限が無いため終了します。「設定⇒アプリと通知」から権限を設定してください。',
        TMsgDlgType.mtError,[TMsgDlgBtn.mbOK], TMsgDlgBtn.mbOK, 0,
        procedure(const AResult:TModalResult)
        begin
          Application.Terminate;
        end
      );
    end;
  end;
end;
procedure TForm1.RequestPermissions;
var FPmsSMS: string;
begin
  FPmsSMS:=JStringToString(
    TJManifest_permission.JavaClass.SEND_SMS);
  PermissionsService.RequestPermissions(
    [FPmsSMS],
    PermissionRequestResult);
end;

end.

3.権限設定画面

SMSメッセージの送信 にチェックを入れてtrueにします。



Copyright 2019 Mam