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

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

SMS送信して送信結果をBroadcastReceiverで受信するAndroidアプリケーション

~DelphiでSMS送信して送信結果をBroadcastReceiverで受信するAndroidアプリケーションを作る。



1.フォームの作成

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

2.ソースコード

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.ScrollBox, FMX.Memo, FMX.StdCtrls
  
  ,Androidapi.JNIBridge ,Androidapi.JNI.Embarcadero
  ,Androidapi.JNI.GraphicsContentViewText, FMX.Controls.Presentation
  ,System.Permissions  ;

type
  TBroadcastReceiverListener = class(TJavaLocal, JFMXBroadcastReceiverListener)
  public
    constructor Create;
    procedure onReceive(context: JContext; intent: JIntent); cdecl;
  end;

  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { private 宣言 }
    FListener: TBroadcastReceiverListener;
    procedure RequestPermissions();
    procedure PermissionRequestResult(Sender: TObject;
      const APermissions: TArray<string>;
      const AGrantResults: TArray<TPermissionStatus>);
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;
  FBroadcastReceiver: JFMXBroadcastReceiver;

const
  SMS_SENT='android.intent.action.SMS_SENT';

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
      //JPendingIntent
  ,Androidapi.JNI.APP ;

  { TMyReceiver }

constructor TBroadcastReceiverListener.Create;
begin
  inherited;
end;

procedure TBroadcastReceiverListener.onReceive(context: JContext; intent: JIntent);
begin
  if JStringToString(intent.getAction)=SMS_SENT then
  begin
    //SMS送信のブロードキャスト
    if FBroadcastReceiver.getResultCode()=TJActivity.JavaClass.RESULT_OK then
      Form1.Memo1.Lines.Add('SMS送信成功')
    else
      Form1.Memo1.Lines.Add('SMS送信失敗');
  end
  else
  begin
    //他のブロードキャスト
    Form1.Memo1.lines.add( JStringToString(intent.getAction));
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var smsTo: JString;
    smsManager: JSmsManager;
    smsMsg:JString;

    Intent: JIntent;
    PendingIntent: JPendingIntent;
begin
  Intent := TJIntent.Create;
  Intent.setAction(StringToJString(SMS_SENT));
  PendingIntent := TJPendingIntent.JavaClass.getBroadcast(
    TAndroidHelper.Context, 0, Intent, 0);

  smsManager := TJSmsManager.JavaClass.getDefault;
  //SMS送信先電話番号を設定する
  smsTo := StringToJString('AAAAAAAAAAA');
  //SMS送信メッセージを設定する
  smsMsg:= StringToJString('ここに'+#13+#10+'メッセージ本文を入力');

  smsManager.sendTextMessage(smsTo, nil, smsMsg, PendingIntent, nil);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Filter: JIntentFilter;
begin
  FListener := TBroadcastReceiverListener.Create;
  FBroadcastReceiver := TJFMXBroadcastReceiver.JavaClass.init(FListener);

  Filter := TJIntentFilter.JavaClass.init;
  //スクリーンのオン、オフをブロードキャストする
  Filter.addAction(TJIntent.JavaClass.ACTION_SCREEN_OFF);
  Filter.addAction(TJIntent.JavaClass.ACTION_SCREEN_ON);
  //バッテリー状態が変化したらブロードキャストする
  Filter.addAction(TJIntent.JavaClass.ACTION_BATTERY_CHANGED);
  //SMSの送信完了をブロードキャストする
  Filter.addAction(StringToJString(SMS_SENT));

  TAndroidHelper.context.getApplicationContext.registerReceiver(
    FBroadcastReceiver, Filter);

  RequestPermissions;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  TAndroidHelper.context.getApplicationContext.unregisterReceiver
    (FBroadcastReceiver);
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にします。


4.実行画面




Copyright 2019 Mam