2016-09-29 12 views
1

Как я могу открыть окно службы коротких сообщений (SMS) на Android-телефоне с предварительно напечатанным текстом сообщения и номером получателя.Delphi FMX приложение для Android. Как открыть окно SMS

В руководствах я нашел только телефон дозвона

 PhoneDialerService.Call(edtTelephoneNumber.Text) 

, которые позволяют сделать вызов, но ничего об отправке SMS-сообщений.

ответ

2

См. Класс SMSManager в Android API.

Существует 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 в конфигурации проекта. См. «Отправить SMS»:

Отправить SMS - Позволяет приложению отправлять СМС-сообщения.

С уважением.

+0

спасибо, но компилятор имеет проблемы с [DCC Error] Unit1.pas (35): E2003 необъявленный идентификатор: 'StringToJString' – milenjao

+1

OK фиксированные .... потребности добавить Androidapi.Helpers к ИСПОЛЬЗУЕТ – milenjao

+0

@milenjao, попробуйте добавьте блок «Androidapi.Helpers». –

2

Вопрос задает вопрос о запуске окна 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. 
Смежные вопросы