SMS送信して送信結果をBroadcastReceiverで受信するAndroidアプリケーションを作る ~Delphiでお手軽プログラミング
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.実行画面
