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.実行画面