Delphi FMX And​​roid应用程序。如何打开短信窗口

时间:2016-09-29 06:14:18

标签: android delphi sms firemonkey

如何在Android模式下打开短消息服务(SMS)窗口,其中包含预先输入的消息文本和收件人编号。

在手册中,我发现只有电话拨号器

      PhoneDialerService.Call(edtTelephoneNumber.Text)

允许拨打电话,但不发送短信。

2 个答案:

答案 0 :(得分:2)

请参阅Android API上的课程SMSManager

您可以使用sendTextMessage方法:

尝试这样的代码:

uses
  Androidapi.Helpers,
  Androidapi.JNI.JavaTypes, 
  Androidapi.JNI.Telephony;

procedure TForm1.Button1Click(Sender: TObject);
var
  destAdress: JString;
  smsManager: JSmsManager;
begin
  smsManager := TJSmsManager.JavaClass.getDefault;
  destAdress := StringToJString('0034123456789');
  smsManager.sendTextMessage(destAdress, nil, StringToJString('The message content'), nil, nil);
end;

您必须add permissions到项目配置。请参阅“发送短信”:

  

发送短信 - 允许应用程序发送短信。

问候。

答案 1 :(得分:2)

问题是关于启动SMS窗口,我已经开始意味着启动内置的SMS发送应用程序。它想要发送目标号码和消息内容。

这可以通过让Android使用意图设置来查看精心设计的特定于SMS的URI并将所需消息作为额外字段包含来启动活动来完成。

调用SMS应用程序而不是在您自己的应用程序中发送SMS的主要好处是它不需要额外的权限 - SMS应用程序已经拥有这些权限。

我在my old activity launching article中展示了如何做到这一点(这是为Delphi XE6编写的,但仍然适用于所有更高版本,并且在这里和那里有一些次要的代码更新),但为了完整性,这里有一个帮助单元做到了这一点:

unit SMSHelperU;

interface

procedure CreateSMS(const Number, Msg: string);

implementation

uses
  Androidapi.Helpers,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.App,
  Androidapi.JNI.Net,
  Androidapi.JNI.GraphicsContentViewText,
  System.SysUtils;

function LaunchActivity(const Intent: JIntent): Boolean; overload;
var
  ResolveInfo: JResolveInfo;
begin
{$IF RTLVersion >= 30}
  ResolveInfo := TAndroidHelper.Activity.getPackageManager.resolveActivity(Intent, 0);
{$ELSE}
  ResolveInfo := SharedActivity.getPackageManager.resolveActivity(Intent, 0);
{$ENDIF}
  Result := ResolveInfo <> nil;
  if Result then
{$IF RTLVersion >= 30}
    TAndroidHelper.Activity.startActivity(Intent);
{$ELSE}
    SharedActivity.startActivity(Intent);
{$ENDIF}
end;

procedure CreateSMS(const Number, Msg: string);
var
  Intent: JIntent;
  URI: Jnet_Uri;
begin
  URI := StrToJURI(Format('smsto:%s', [Number]));
  Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, URI);
  Intent.putExtra(StringToJString('sms_body'), StringToJString(Msg));
  LaunchActivity(Intent);
end;

end.

可以这样调用例程:

CreateSMS('123456789', 'O HAI2U!');

如果您确实想要实际发送短信,则下面的单元执行该作业,但也包括自行检查为应用设置的相关权限的代码:

unit AndroidStuff;

interface

function HasPermission(const Permission: string): Boolean;
procedure SendSMS(const Number, Msg: string);

implementation

uses
  System.SysUtils,
  System.UITypes,
{$IF RTLVersion >= 31}
  FMX.DialogService,
{$ELSE}
  FMX.Dialogs,
{$ENDIF}
  FMX.Helpers.Android,
  Androidapi.Helpers,
  Androidapi.JNI.App,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.Telephony;

function HasPermission(const Permission: string): Boolean;
begin
  //Permissions listed at http://d.android.com/reference/android/Manifest.permission.html
{$IF RTLVersion >= 30}
  Result := TAndroidHelper.Context.checkCallingOrSelfPermission(
{$ELSE}
  Result := SharedActivityContext.checkCallingOrSelfPermission(
{$ENDIF}
    StringToJString(Permission)) =
    TJPackageManager.JavaClass.PERMISSION_GRANTED
end;

procedure SendSMS(const Number, Msg: string);
var
  SmsManager: JSmsManager;
begin
  if not HasPermission('android.permission.SEND_SMS') then
{$IF RTLVersion >= 31}
    TDialogService.MessageDialog('App does not have the SEND_SMS permission', TMsgDlgType.mtError, [TMsgDlgBtn.mbCancel], TMsgDlgBtn.mbCancel, 0, nil)
{$ELSE}
    MessageDlg('App does not have the SEND_SMS permission', TMsgDlgType.mtError, [TMsgDlgBtn.mbCancel], 0)
{$ENDIF}
  else
  begin
    SmsManager := TJSmsManager.JavaClass.getDefault;
    SmsManager.sendTextMessage(
      StringToJString(Number),
      nil,
      StringToJString(Msg),
      nil,
      nil);
  end;
end;

end.