Перейти к содержанию
  • 0
Rusland

Как отправить SMS c определенной симкарты?

Вопросы

Как программно отправить SMS c определенной симкарты (бывает что на телефоне две и более sim-карт)?  

Поделиться сообщением


Ссылка на сообщение

Рекомендуемые сообщения

  • 0

на сколько помню, никак на android ниже 5.0

т.к. на уровне api нет/не было поддержки двух и более сим карт. и каждый производитель городит свой способ.

Поделиться сообщением


Ссылка на сообщение
  • 0
{$IFDEF ANDROID}
procedure SendSms(const Number, Msg: string);
var
  Intent: JIntent;
  Uri: Jnet_Uri;
begin
  Uri := TJnet_Uri.JavaClass.parse(StringToJString(Format('smsto:%s', [Number])));
  Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri);
  Intent.putExtra(StringToJString('sms_body'), StringToJString(Msg));
  sharedActivity.startActivity(Intent);
end;
{$ENDIF}

отправляется всегда с выбранной(активной) сим карты. а на счёт апи не в курсе

Поделиться сообщением


Ссылка на сообщение
  • 0

ZuBy, спасибо. Это как раз метод отправки через стандартное приложение.

 

Вот нашел метод отправки напрямую из программы:

uses   Androidapi.JNI.JavaTypes, Androidapi.JNI.Telephony,  Androidapi.Helpers;
...
procedure TFrmMain.BtnSendSmsClick(Sender: TObject);
var
  SmsTo: JString;
  SmsManager: JSmsManager;
begin
  SmsManager := TJSmsManager.JavaClass.getDefault;
  SmsTo := StringToJString('+79*********');
  SmsManager.sendTextMessage(smsTo, nil, StringToJString('Test SMS'), nil, nil);
end;

отправляется всегда с выбранной(активной) сим карты

У меня например нет активной симкарты, а система должна предлагать выбор... но отправка делается с 1ой sim.

Отредактировал Rusland

Поделиться сообщением


Ссылка на сообщение
  • 0

ZuBy, спасибо. Это как раз метод отправки через стандартное приложение.

 

Вот нашел метод отправки напрямую из программы:

uses   Androidapi.JNI.JavaTypes, Androidapi.JNI.Telephony,  Androidapi.Helpers;
...
procedure TFrmMain.BtnSendSmsClick(Sender: TObject);
var
  SmsTo: JString;
  SmsManager: JSmsManager;
begin
  SmsManager := TJSmsManager.JavaClass.getDefault;
  SmsTo := StringToJString('+79*********');
  SmsManager.sendTextMessage(smsTo, nil, StringToJString('Test SMS'), nil, nil);
end;

отправляется всегда с выбранной(активной) сим карты

У меня например нет активной симкарты, а система должна предлагать выбор... но отправка делается с 1ой sim.

Доброе суток. Я попробовал ваш код, но при отправке вылетает ошибка "java.lang.securityexception: sending sms message:uid 10250 does not have android.permission.send_sms"

Поделиться сообщением


Ссылка на сообщение
  • 0

 

ZuBy, спасибо. Это как раз метод отправки через стандартное приложение.

 

Вот нашел метод отправки напрямую из программы:

uses   Androidapi.JNI.JavaTypes, Androidapi.JNI.Telephony,  Androidapi.Helpers;
...
procedure TFrmMain.BtnSendSmsClick(Sender: TObject);
var
  SmsTo: JString;
  SmsManager: JSmsManager;
begin
  SmsManager := TJSmsManager.JavaClass.getDefault;
  SmsTo := StringToJString('+79*********');
  SmsManager.sendTextMessage(smsTo, nil, StringToJString('Test SMS'), nil, nil);
end;

отправляется всегда с выбранной(активной) сим карты

У меня например нет активной симкарты, а система должна предлагать выбор... но отправка делается с 1ой sim.

Доброе суток. Я попробовал ваш код, но при отправке вылетает ошибка "java.lang.securityexception: sending sms message:uid 10250 does not have android.permission.send_sms"

 

Разобрался, надо добавить  пермишин) Всем большое спасибо 

Поделиться сообщением


Ссылка на сообщение
  • 0

Спасибо за код, но как Вы решали отправку длинного смс сообщения, т.е. более 67 символов на Кириллице?

Поделиться сообщением


Ссылка на сообщение
  • 0

Надо зайти в Настройки - Подключения- Диспечер SIM-карт  - SMS  под ней выбрать какую сим карту использовать по умлчанию

Поделиться сообщением


Ссылка на сообщение

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От Tumaso
      Подскажите, каким образом можно прочитать входящее СМС под iOS? Для Android на форуме есть работающий пример, а вот под iOS найти не удалось.
    • От ENERGY
      Привет.
      Для отправки смс используется SMSManager  и его функция.
      smsManager.sendTextMessage(smsTo, nil, StringToJString('Test SMS'), nil, nil); Описание ее на сайте developer.android.com . Для того чтобы узнать статус отправлена смс или нет, нужно указать предпоследний параметр 
      sentIntent PendingIntent: if not NULL this PendingIntent is broadcast when the message is successfully sent, or failed. The result code will be Activity.RESULT_OK for success, or one of these errors:
      RESULT_ERROR_GENERIC_FAILURE
      RESULT_ERROR_RADIO_OFF
      RESULT_ERROR_NULL_PDU. Я также нашел описание как добавить этот параметр на StackOverflow, но там не указаны детали. 
      Вот что пишет этот человек:  You have to createIntent objects first, THEN create PendingIntent objects to wrap those Intent objects, THEN pass the PendingIntent objects to sendTextMessage() and use a broadcastReceiver to receive the Intent objects.
       
      Итак я создаю интент, и оборачиваю его в PendingIntent по аналогии со статьей Андрея Ефимова: 
       // Создаём Интент
      Intent := TJIntent.Create; Intent.setClassName(TAndroidHelper.Context, StringToJString('com.TestReceiver.AlarmReceiver')); // Оборачиваем Интент в PendingIntent
      PendingIntent := TJPendingIntent.JavaClass.getBroadcast(TAndroidHelper.Context, 1, Intent, 0);
      И вставляю это PendingIntent в код sendTextMessage
       
      Когда вернутся код ошибки SMS, то насколько я понял сработает ява код, на который зарегистрирован прием: 
      package com.TestReceiver;   import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent;   public class AlarmReceiver extends BroadcastReceiver {     public void onReceive(Context context, Intent intent) {             Intent TestLauncher = new Intent();             TestLauncher.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity");             TestLauncher.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);             context.startActivity(TestLauncher);     } }  
      Вопрос в следующем: 
      Как мне эту цифру с ошибкой  Activity.RESULT_OK (или RESULT_ERROR_GENERIC_FAILURE или любой другой) вытащить оттуда и передать в программу?
      Upd1:
      Это результат вызова из Java кода метода getResultCode().
      Можно ли getResultCode вызвать из Delphi, а не из Java кода?
       
       
       
    • От ENERGY
      Приветствую.
      Нужно в определенное время отправлять несколько смс сообщений, к примеру это может быть через час, день, неделю.
      Подскажите как лучше это реализовать.
      В виде Android фонового сервиса или при помощи AlarmManager?
      Я где-то пару месяцев назад уже пытался сделать фоновой сервис для другой задачи, но у меня ничего не получилось, программа закрывалась системой, в общем пришлось забросить. Возможно есть рабочий код на эту тему? Для Java готовых решений полно, а вот для Delphi пока нет стандартного примера сервиса (основы), который бы работал всегда в Android системе. Почему то сообщество медленно развивается.
      Заранее спасибо за советы, очень жду мнения опытных программистов.
       
    • От lev.vorobyov
      Доброе время суток. Как можно удалять сообщение(входящие) или же полностью очистить папку входящие?
      (Adroid 5.0)
      Заранее спасибо)
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...