如何在Android模式下打开短消息服务(SMS)窗口,其中包含预先输入的消息文本和收件人编号。
在手册中,我发现只有电话拨号器
PhoneDialerService.Call(edtTelephoneNumber.Text)
允许拨打电话,但不发送短信。
答案 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.