• 0
Авторизация  
tromani

BroadcastReceiver в сервисе

Вопросы

Собственно сабж, перенес из основной программы в сервис ничего не работает может чтото не так делаю подскажите

смысл в том чтоб в сервисе обрабатывать входящие смс

unit utMainsmsResolver;

interface

uses
  System.SysUtils,
  System.Classes,
  System.Android.Service,
  AndroidApi.JNI.GraphicsContentViewText,
  Androidapi.JNI.Os,
  Androidapi.JNI.App,
  CSBroadcastReceiver,
  Androidapi.JNI.JavaTypes,
  IdHTTP, IdCoderMIME,RR.HTTPwider,

  Androidapi.Jni,
  Androidapi.Helpers,
  Androidapi.JNI.Provider,
  Androidapi.JNI.Net,
  Androidapi.JNIBridge,
  Androidapi.JNI.Telephony;

type
  TDM = class(TAndroidIntentService)
    function AndroidServiceStartCommand(const Sender: TObject;
      const Intent: JIntent; Flags, StartId: Integer): Integer;
    procedure AndroidServiceDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure CreateBroadcastReceiver;
    procedure BroadcastReceiverOnReceive(csContext: JContext; csIntent: JIntent);
    procedure CheckSmsInState(Context: JContext; Intent: JIntent);
  end;

var
  DM: TDM;
  BroadcastReceiver: TCSBroadcastReceiver;

implementation

{%CLASSGROUP 'FMX.Controls.TControl'}

{$R *.dfm}

procedure TDM.CreateBroadcastReceiver;
begin
  if not Assigned(BroadcastReceiver) then
    begin
      BroadcastReceiver:= TCSBroadcastReceiver.Create(nil);
      BroadcastReceiver.OnReceive:= BroadcastReceiverOnReceive;
      BroadcastReceiver.RegisterReceive;
      BroadcastReceiver.Add('android.provider.Telephony.SMS_RECEIVED',-1);
    end;
end;

procedure TDM.BroadcastReceiverOnReceive(csContext: JContext; csIntent: JIntent);
begin
  CheckSmsInState(csContext, csIntent);
end;

procedure TDM.CheckSmsInState(Context: JContext; Intent: JIntent);
begin
  // чтото делаем с смс
end;

procedure TDM.AndroidServiceDestroy(Sender: TObject);
begin
  if Assigned(BroadcastReceiver) then
    FreeAndNil(BroadcastReceiver);
end;

function TDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
  CreateBroadcastReceiver;
  Result:=TJService.JavaClass.START_STICKY;
  //CreateBroadcastReceiver;
end;

пробовал метод 

CreateBroadcastReceiver

вставлять и до и после start_sticky и в onCreate результат один ничего не происходит

версия IDE - berlin

повторюсь если в коде основной программы то все работает на ура

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


Ссылка на сообщение
Поделиться на другие сайты

0 ответов на этот вопрос

Ответы на этот вопрос пока отсутствуют

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

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

    • От x11
      Это не вопрос. Просто подумал, что кому-нибудь может пригодится.
      https://forums.embarcadero.com/thread.jspa?threadID=118465
      Используем 2 файла: Androidapi.JNI.ToastForService.pas + FlyUtils.Android.PostRunnableAndTimer.pas.
      Пример вызова:
      Androidapi.JNI.ToastForService.PostToast('текст сообщения', LongToast); Проверил - работает.
      Есть ещё третий параметр "UseLastToastObj", но я так и не понял, для чего он. Документации нет.
    • От x11
      Приложение + служба.
      В службе установлен флаг перезапуска в StrartCommand^
      result := TJService.JavaClass.START_STICKY; // rerun service if host app stops  
      Проблема вот в чем. На экране главная форма хост-приложения.  На смартфоне внизу нажимаю кнопку Назад. Приложение закрывается.
      Вижу в LogCat Андроида, что аварийно завершается служба. Андроид восстанавливает работу службы и запускает и службу и само приложение. Хотя Андроид не должен перезапускать host-приложение, а только службу.
       
       
      Т.е. вижу, что поле выхода приложение со службой работают.
      Когда с рабочего стала ланчера запсукаю host-приложение, то оно виснет при старте и даже событие OnCreate главной формы не срабатывает. Показывается стартовое окно (splash) и висит, пока Андроид не предложит закрыть или подождать. И так несколько раз приходится делать, пока приложение не запустится.
      Я в OnClose главной формы разные параметры прописывал для action, но толку нет.
      Хоть какой-нибудь костыль посоветуйте, пожалуйста.
       
      А когда нажимаю кнопку Домой на смартфоне, то приложение сворачивается и тогда запсу с рабочего стола ланчера происходит нормально, т.е. приложение просто всплывает.
      Может можно как-то при закрытии приложения не закрывать его, а сворачивать?
      Если я не запускаю службу, то приложение закрывается и потом запускается нормально с рабочего стола ланчера.
      Заранее благодарен.
    • От brunnengi
      Здравствуйте.
      Требуется программа на андроид с набором кнопок со следующем функционалом:
      1. Кнопка1 - создать базу в test.sqlite (в том месте где доступ к нему есть только у самого приложения (имею ввиду если это не ROOT телефон, при рут и так всё понятно)
      2. Кнопка2 - создать таблицу в базе test.sqlite с названием "TblTest01" (с разным набором полей на своё усмотрение)
      3. Кнопка3 - создать таблицу в базе test.sqlite с названием "TblTest02" (с разным набором полей на своё усмотрение)
      4. Кнопка4 - Добавить строку в таблицу "TblTest01" (любой набор данных на ваших усмотрение)
      5. Кнопка5 - Удалить строку в таблице "TblTest01" (по любому ключу на ваше усмотрение)
      6. Кнопка6 - Изменить строку в таблице "TblTest01" (по любому ключу и любое значение на ваше усмотрение)
       
      Приложение должно иметь фоновый сервис, который должен получать данные с сервера и добавлять их в базу test.sqlite в таблицу "TblTest02".
      При получение новый данных, сервис должен показать в "шторке" сообщение, по клику на которую открывается само приложение с визуальной частью.
      Т.е. если визуально приложение закрыто, выгружено, не запущено или запущено, фоновый процесс должен сам делать запросы к серверу и добавлять новые данные в базу, если они есть/поступили
      Приложение должно запускаться вместе с системой, после перезагрузки и т.д.
      Использовать только те компоненты что доступны в самой среде из коробки.
      Часть где делается запрос к серверу должен иметь timeout равный 20 секундам.
      Сервис должен грамотно делать запросы к серверу как положено в Андроид приложениях. 
      Серверная часть мне не нужна, можете для теста сами эмулирвать эти процессы.
       
       
      -----
      ЦЕНА: 2500р.
      СРОКИ: Не горит, но в целом где то дней 7 есть
      Перечисляю на QIWI, ЯД, Сбербанк, короче куда скажите.
    • От x11
      Как проверить, работает ли моя служба?
      Т.е. перед запуском или остановкой хочется выполнить проверку.
       
      FService := TJIntent.Create; FService.setClassName(TAndroidHelper.Context.getPackageName, TAndroidHelper.StringToJString('com.embarcadero.services.pak1')); FService.setAction(StringToJString('StopService')); TAndroidHelper.Activity.startService(FService);  
    • От x11
      Так и должно быть, что событие "BroadcastReceiver.OnReceive" срабатывает 2 раза подряд?
      Код создания. Проверял: создается только один BroadcastReceiver.
      procedure TDMSrv.CreateBroadcastReceiver; begin BroadcastReceiver := TCSBroadcastReceiver.Create(nil); BroadcastReceiver.OnReceive := BroadcastReceiverOnReceive; BroadcastReceiver.RegisterReceive; BroadcastReceiver.Items.Clear; BroadcastReceiver.Add(PHONE_STATE); BroadcastReceiver.Add(NEW_OUTGOING_CALL); Log('CreateBroadcastReceiver'); end;  
      Сам код события:
      procedure TDMSrv.BroadcastReceiverOnReceive(csContext: JContext; csIntent: JIntent); begin log('BroadcastReceiverOnReceive'); CheckPhoneCallState(csContext, csIntent); end;  
      Ну и сама процедура обработки:
      procedure TDMSrv.CheckPhoneCallState(Context: JContext; Intent: JIntent); var telephonyService: JObject; telephonyManager: JTelephonyManager; state: JString; incomingCallNumber: string; outgoingCallNumber: string; outputResult: string; begin Log('CheckPhoneCallState: ' + JStringToString(Intent.getAction)); outputResult:= sLineBreak; telephonyService := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE); telephonyManager := TJTelephonyManager.Wrap((telephonyService as ILocalObject).GetObjectID); if JStringToString(Intent.getAction).Equals(PHONE_STATE) then begin state := Intent.getStringExtra(TJTelephonyManager.JavaClass.EXTRA_STATE); if state.equals(TJTelephonyManager.JavaClass.EXTRA_STATE_IDLE) then outputResult:= outputResult + 'Phone is IDLE ' + sLineBreak else if state.equals(TJTelephonyManager.JavaClass.EXTRA_STATE_RINGING) then begin incomingCallNumber := JStringToString(Intent.getStringExtra(TJTelephonyManager.JavaClass.EXTRA_INCOMING_NUMBER)); if incomingCallNumber.Equals('') then incomingCallNumber:= 'PRIVATE NUMBER'; outputResult := outputResult + 'Phone is RINGING' + sLineBreak; outputResult := outputResult + 'Incoming call from ' + incomingCallNumber + sLineBreak; LaunchNotification(incomingCallNumber, 'Входящий вызов'); InsertTel(incomingCallNumber, True); end else if state.equals(TJTelephonyManager.JavaClass.EXTRA_STATE_OFFHOOK) then outputResult:= outputResult + 'Phone is OFFHOOK' + sLineBreak; end else if JStringToString(Intent.getAction).Equals(NEW_OUTGOING_CALL) then begin outgoingCallNumber:= JStringToString(Intent.getStringExtra(TJIntent.JavaClass.EXTRA_PHONE_NUMBER)); outputResult:= outputResult + 'Outgoing call to ' + outgoingCallNumber + sLineBreak; LaunchNotification(outgoingCallNumber, 'Исходящий вызов'); InsertTel(outgoingCallNumber, False); end; Log(outputResult); end;  

    • От x11
      На основе нескольких тем форума сделал службу перехвата звонков и номера телефона.
      http://fire-monkey.ru/topic/3878-статьякак-создать-простой-android-broadcast-receiver-how-to-implement-simplest-android-broadcast-receiver-in-delphi/
      http://fire-monkey.ru/topic/2386-перехват-события-звонка/
      http://fire-monkey.ru/topic/2972-использование-нативных-localbroadcastmanager-и-broadcastreceiver/
      Покритикуйте пожалуйста. Уверен, что не всё правильно.
      Но что до ума не удалось довести, так это то, как правильно останавливать службу и закрывать приложение.
      Проект (для Токио) приложил теме.
      Заранее благодарен.
       
      BR2.rar
    • От x11
      Заметил, что после удаления библиотеки-сервиса всё равно в host-приложении остаётся мусор.

    • От x11
      Прошу помощи или хотя бы совета.
      Кто-то уже пытался создать службу, которая может перехватывать звонки входящие и исходящие?
      Пример для обычного приложения есть с таким кодом
      TPlatformServices.Current.SupportsPlatformService(IFMXPhoneDialerService, IInterface(PhoneDialerService)); if Assigned(PhoneDialerService) then PhoneDialerService.OnCallStateChanged := MyOnCallStateChanged;  
      Плюс пытаюсь всё это скрестить с NotificationCenter, но служба при запуске зависает и падает.
       
       
    • От x11
      Экспериментировал с сервисами.
      После переименования проекта библиотеки сервиса удалил и снова хочу добавить к host-проекту библиотеку-service.
      На первом шаге выбираю "Искать автоматически". На втором выбираю папку, где живет проект-библиотека, но среда ругается и выдает старое имя. Но я не могу найти, где именно среда находит это старое имя.


    • От x11
      Использую стандартный пример из папки
      C:\Users\Public\Documents\Embarcadero\Studio\19.0\Samples\Object Pascal\Multi-Device Samples\Device Sensors and Services\AndroidNotificationServiceDemo\NotificationService
      Delphi Tokyo.
      Компилируется и запускается на устройстве. Нажимаю кнопку Start service, но ничего не происходит. Т.е. совсем ничего: ни ошибок, ни падений приложения, никаких сообщений.
      В какую строну копать?
      И вообще, как проверить, работает ли мой сервис?
       
      Я от крыл в настройках андроида "Запущенные программы", но там нет даже моего приложения в списке, хотя приложение запущено.
      Пробовал на Андроид версий 5 и 6.
  • Последние посетители   0 пользователей онлайн

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