Вопрос задает вопрос о запуске окна SMS, которое я использовал для запуска встроенного приложения для отправки SMS-сообщений. Он хочет, чтобы номер цели и содержимое сообщения были отправлены.
Это можно сделать, попросив Android начать работу, используя намерение, настроенное для просмотра тщательно обработанного 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!');
Если вы сделали действительно хотите отправить SMS ниже блок делает эту работу, но также включает в себя код, который самостоятельно проверяет соответствующее разрешение для приложения:
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.
спасибо, но компилятор имеет проблемы с [DCC Error] Unit1.pas (35): E2003 необъявленный идентификатор: 'StringToJString' – milenjao
OK фиксированные .... потребности добавить Androidapi.Helpers к ИСПОЛЬЗУЕТ – milenjao
@milenjao, попробуйте добавьте блок «Androidapi.Helpers». –