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

Использование нативных LocalBroadcastManager и BroadcastReceiver

Вопросы

Из PlatformSDK (PlatformSDKs\android-sdk-windows\sources\android-23\android\support\v4\content\) портировал в Delphi класс TJLocalBroadcastManager.

Это очень полезный класс, если вы не хотите рассылать сообщения по всей системе, а есть необходимость общаться только внутри приложения или между хост-приложением и сервисом.

Во вложении сам класс, в своем приложении убедитесь, что в Target Platforms (Android) → Android → Libraries включена библиотека android-support-v4.dex.jar.

 

Прилагаю пример, для изучения и использования в работе, который демонстрирует работу обычного BroadcastReceiver и LocalBroadcastReceiver.

В примере демонстрируется работа сообщений в приложении и сервисе. Сначала делаем build проекта LBCRService, потом будет доступна возможность собрать LocalBCR.

Собираю в Berlin 10.1, но на младших версиях тоже должно работать, по крайней мере в Seatlle.

 

В реализации методов

    procedure RegisterReceiver();
    procedure UnRegisterReceiver();

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

 

 

Androidapi.JNI.LocalBroadcastManager.pas.zip

LocalBroadCastReceiver.zip

Отредактировал Pax Beach
дополнил решение

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


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

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

  • 0

ну что я могу сказать, все висит. ничего не могу сделать

android 6.0.1

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
7 минут назад, ZuBy сказал:

ну что я могу сказать, все висит. ничего не могу сделать

android 6.0.1

Где висит?

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

Исходный код открыт, можно понять, где зависает.

 

Отредактировал Pax Beach

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


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

приложение запускается и всё, ничего нажать невозможно

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
14 минуты назад, ZuBy сказал:

приложение запускается и всё, ничего нажать невозможно

Как видно в исходных кодах, при создании, запуске или активации контролов нет ни каких обработчиков. События начинаются, когда жмете на кнопки.

Монитор что-нибудь полезное сообщает?

Я тестирую на платформе android-19, SDK 23.0.3. Что у Вас стоит?

 

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


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

А  как бы это  скрестить со службой, которая следит за входящими и исходящими вызовами?

 

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


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

При входящем звонке система сама рассылает уведомление об этом. Нужно на него просто подписаться. Код уведомления надо поискать в справочнике разработчика.

Предполагаю, что здесь https://developer.android.com/reference/android/telephony/TelephonyManager.html

 

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


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

Я тоже. Тут весь форум об этом.

Но Android не понимает Delphi, а Delphi использует простые обертки над Java классами

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


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

Но Вы ссылку дали на android.com, т.е. Вы предлагает переписать TelephonyManager только на Delphi?

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


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

Я предлагаю использовать вызовы методов этого интерфейса. Уже все написано за вас.

Не зная, как пользоваться Android Developer, под Android не получится ничего толкового написать.

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
3 часа назад, Pax Beach сказал:

Не зная, как пользоваться Android Developer, под Android не получится ничего толкового написать.

Так в том-то и дело, что те, кто знает Java и Android, не будут использовать FMX.

 

 

3 часа назад, Pax Beach сказал:

Я предлагаю использовать вызовы методов этого интерфейса. Уже все написано за вас.

Я, например, пока что не имею представления о том, как использовать методы этого интерфейса.

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 04.07.2016 в 12:44, Pax Beach сказал:

LocalBroadCastReceiver.zip

проект не компилируется в Tokyo

 

Цитата

[Exec Error] The command "PATH  ... ... ... exited with code 1.

 

Наверное из-за этого.

Screenshot_1.png

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

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


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

Ага, создал ProjectGroup, туда добавил службу, построил её, а потом только сам host-проект.

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


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

Взял Ваш пример. Убрал всё лишнее. Вернее оставил приём сообщений только в службе.

Добавил разрешение process outgouin calls. Добавил в AndroidManifest.template.xml receiver.

Скомпилировал, запустил.

Когда нажимаю кнопку отправки сообщения в самом приложении, то в логе видно, что сообщение приходит в сервис.

Но когда выполняю физически исходящий звонок на Андроиде, то приложение валится с кучей ошибок:

Скрытый текст

01-23 20:48:02.348: I/info(18974): Sended the action ACTION_NEW_OUTGOING_CALL
01-23 20:48:02.358: I/info(18974): SVC TMyReceiverListener.onReceive: ACTION_NEW_OUTGOING_CALL
01-23 20:48:09.256: E/AndroidRuntime(18974): FATAL EXCEPTION: main
01-23 20:48:09.256: E/AndroidRuntime(18974): Process: com.embarcadero.LocalBCR, PID: 18974
01-23 20:48:09.256: E/AndroidRuntime(18974): java.lang.RuntimeException: Unable to instantiate receiver com.embarcadero.LocalBCR.OutgoingCallReceiver: java.lang.ClassNotFoundException: Didn't find class "com.embarcadero.LocalBCR.OutgoingCallReceiver" on path: DexPathList[[zip file "/data/app/com.embarcadero.LocalBCR-1/base.apk"],nativeLibraryDirectories=[/data/app/com.embarcadero.LocalBCR-1/lib/arm, /vendor/lib, /system/lib]]
01-23 20:48:09.256: E/AndroidRuntime(18974):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2689)
01-23 20:48:09.256: E/AndroidRuntime(18974):     at android.app.ActivityThread.access$1700(ActivityThread.java:144)
01-23 20:48:09.256: E/AndroidRuntime(18974):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)
01-23 20:48:09.256: E/AndroidRuntime(18974):     at android.os.Handler.dispatchMessage(Handler.java:102)
01-23 20:48:09.256: E/AndroidRuntime(18974):     at android.os.Looper.loop(Looper.java:155)
01-23 20:48:09.256: E/AndroidRuntime(18974):     at android.app.ActivityThread.main(ActivityThread.java:5727)
01-23 20:48:09.256: E/AndroidRuntime(18974):     at java.lang.reflect.Method.invoke(Native Method)
01-23 20:48:09.256: E/AndroidRuntime(18974):     at java.lang.reflect.Method.invoke(Method.java:372)
01-23 20:48:09.256: E/AndroidRuntime(18974):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
01-23 20:48:09.256: E/AndroidRuntime(18974):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)
01-23 20:48:09.256: E/AndroidRuntime(18974): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.embarcadero.LocalBCR.OutgoingCallReceiver" on path: DexPathList[[zip file "/data/app/com.embarcadero.LocalBCR-1/base.apk"],nativeLibraryDirectories=[/data/app/com.embarcadero.LocalBCR-1/lib/arm, /vendor/lib, /system/lib]]
01-23 20:48:09.256: E/AndroidRuntime(18974):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
01-23 20:48:09.256: E/AndroidRuntime(18974):     at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
01-23 20:48:09.256: E/AndroidRuntime(18974):     at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
01-23 20:48:09.256: E/AndroidRuntime(18974):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2684)
01-23 20:48:09.256: E/AndroidRuntime(18974):     ... 9 more
01-23 20:48:09.256: E/AndroidRuntime(18974):     Suppressed: java.lang.ClassNotFoundException: com.embarcadero.LocalBCR.OutgoingCallReceiver
01-23 20:48:09.256: E/AndroidRuntime(18974):         at java.lang.Class.classForName(Native Method)
01-23 20:48:09.256: E/AndroidRuntime(18974):         at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
01-23 20:48:09.256: E/AndroidRuntime(18974):         at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
01-23 20:48:09.256: E/AndroidRuntime(18974):         at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
01-23 20:48:09.256: E/AndroidRuntime(18974):         ... 11 more
01-23 20:48:09.256: E/AndroidRuntime(18974):     Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
01-23 20:48:11.198: D/Process(18974): killProcess, pid=18974
01-23 20:48:11.208: D/Process(18974): com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException:138 java.lang.ThreadGroup.uncaughtException:693 java.lang.ThreadGroup.uncaughtException:690
01-23 20:48:11.488: E/Typeface(19911): SANS_LOC file not found.
01-23 20:48:11.498: E/AndroidRuntime(19911): FATAL EXCEPTION: main
01-23 20:48:11.498: E/AndroidRuntime(19911): Process: com.embarcadero.LocalBCR, PID: 19911
01-23 20:48:11.498: E/AndroidRuntime(19911): java.lang.RuntimeException: Unable to instantiate receiver com.embarcadero.LocalBCR.OutgoingCallReceiver: java.lang.ClassNotFoundException: Didn't find class "com.embarcadero.LocalBCR.OutgoingCallReceiver" on path: DexPathList[[zip file "/data/app/com.embarcadero.LocalBCR-1/base.apk"],nativeLibraryDirectories=[/data/app/com.embarcadero.LocalBCR-1/lib/arm, /vendor/lib, /system/lib]]
01-23 20:48:11.498: E/AndroidRuntime(19911):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2689)
01-23 20:48:11.498: E/AndroidRuntime(19911):     at android.app.ActivityThread.access$1700(ActivityThread.java:144)
01-23 20:48:11.498: E/AndroidRuntime(19911):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)
01-23 20:48:11.498: E/AndroidRuntime(19911):     at android.os.Handler.dispatchMessage(Handler.java:102)
01-23 20:48:11.498: E/AndroidRuntime(19911):     at android.os.Looper.loop(Looper.java:155)
01-23 20:48:11.498: E/AndroidRuntime(19911):     at android.app.ActivityThread.main(ActivityThread.java:5727)
01-23 20:48:11.498: E/AndroidRuntime(19911):     at java.lang.reflect.Method.invoke(Native Method)
01-23 20:48:11.498: E/AndroidRuntime(19911):     at java.lang.reflect.Method.invoke(Method.java:372)
01-23 20:48:11.498: E/AndroidRuntime(19911):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
01-23 20:48:11.498: E/AndroidRuntime(19911):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)
01-23 20:48:11.498: E/AndroidRuntime(19911): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.embarcadero.LocalBCR.OutgoingCallReceiver" on path: DexPathList[[zip file "/data/app/com.embarcadero.LocalBCR-1/base.apk"],nativeLibraryDirectories=[/data/app/com.embarcadero.LocalBCR-1/lib/arm, /vendor/lib, /system/lib]]
01-23 20:48:11.498: E/AndroidRuntime(19911):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
01-23 20:48:11.498: E/AndroidRuntime(19911):     at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
01-23 20:48:11.498: E/AndroidRuntime(19911):     at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
01-23 20:48:11.498: E/AndroidRuntime(19911):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2684)
01-23 20:48:11.498: E/AndroidRuntime(19911):     ... 9 more
01-23 20:48:11.498: E/AndroidRuntime(19911):     Suppressed: java.lang.ClassNotFoundException: com.embarcadero.LocalBCR.OutgoingCallReceiver
01-23 20:48:11.498: E/AndroidRuntime(19911):         at java.lang.Class.classForName(Native Method)
01-23 20:48:11.498: E/AndroidRuntime(19911):         at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
01-23 20:48:11.498: E/AndroidRuntime(19911):         at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
01-23 20:48:11.498: E/AndroidRuntime(19911):         at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
01-23 20:48:11.498: E/AndroidRuntime(19911):         ... 11 more
01-23 20:48:11.498: E/AndroidRuntime(19911):     Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

 

 

Пока не знаю, куда дальше копать.

Это моя вина? Я что-то забыл? Что-то не так сделал?

 

Я так понимаю, что проблема в этом?

Цитата

Caused by: java.lang.ClassNotFoundException: Didn't find class "com.embarcadero.LocalBCR.OutgoingCallReceiver"

Я что-то неправильно в XML прописал?

Screenshot_1.png

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

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


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

Пока я не понял, что прописать в XML

<receiver android:name=".OutgoingCallReceiver" >

вместо ".OutgoingCallReceiver"

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
19 часов назад, x11 сказал:

Пока я не понял, что прописать в XML


<receiver android:name=".OutgoingCallReceiver" >

вместо ".OutgoingCallReceiver"

Нет Дельфи под рукой, трудно подсказать.
А можно весь манифест увидеть, и monitor log желательно, права в проекте все предоставлены?

Кстати Android какой, а то может права дополнительно Runtime запрашивать надо?

На форуме есть все примеры для этого.

Свой пример писал кажется под Android 5.0.

 

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, Pax Beach сказал:


А можно весь манифест увидеть

прикрепил проект

 

1 час назад, Pax Beach сказал:

Свой пример писал кажется под Android 5.0.

я запускал на Android 5.0.2

BR.rar

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

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


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

вот кусок кода из сервиса из Вашего примера

else if Action = 'KillApplication' then
  begin
    Log('"Die! command geted');
    Intent.setAction(StringToJString('StartService'));

    TJActivityManager.Wrap((LJO as ILocalObject).GetObjectID)
      .killBackgroundProcesses(StringToJString('com.embarcadero.LocalBCR'));
  end

Подскажите, зачем при "KillApplication" выполнять "StartService"?

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
procedure TfmMain.btStopServiceStartCommandClick(Sender: TObject);
begin
  Log('Service to be stoped by StartCommand');
  FService := TJIntent.Create;
  FService.setClassName(TAndroidHelper.Context.getPackageName(),
    TAndroidHelper.StringToJString('com.embarcadero.services.LBCRService'));
  FService.setAction(StringToJString('StopService'));
  TAndroidHelper.Activity.startService(FService);
end;

 

а зачем здесь "startService" последней строкой?

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


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

Вот, что у меня получилось http://fire-monkey.ru/topic/4723-служба-перехват-номера/   Покритикуйте, пожалуйста.

 

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
9 часов назад, x11 сказал:

procedure TfmMain.btStopServiceStartCommandClick(Sender: TObject);
begin
  Log('Service to be stoped by StartCommand');
  FService := TJIntent.Create;
  FService.setClassName(TAndroidHelper.Context.getPackageName(),
    TAndroidHelper.StringToJString('com.embarcadero.services.LBCRService'));
  FService.setAction(StringToJString('StopService'));
  TAndroidHelper.Activity.startService(FService);
end;

 

а зачем здесь "startService" последней строкой?

StartCommand вызывается каждый раз, когда мы вызываем из приложения StartService.

А как обрабатывать намерение (Intent) переданный в этот метод — это наше дело.

У меня в этой команде обрабатывался и старт и стоп.

Убивать приложение через KillBackgroundProcess не обязательно, это осталось от моего другого приложения, где выгрузить процесс из памяти было критичным.

 

Отредактировал Pax Beach

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
function TDM.AndroidServiceStartCommand( ...
..
..

  if Action = 'KillApplication' then
  begin
    Log('"Die! command geted');
    Intent.setAction(StringToJString('StartService'));

    TJActivityManager.Wrap(ILocalObject(LJO).GetObjectID).killBackgroundProcesses(StringToJString('com.embarcadero.LocalBCR'));
  end;

А зачем StartService в KillApplication?

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
34 минуты назад, x11 сказал:

function TDM.AndroidServiceStartCommand( ...
..
..

  if Action = 'KillApplication' then
  begin
    Log('"Die! command geted');
    Intent.setAction(StringToJString('StartService'));

    TJActivityManager.Wrap(ILocalObject(LJO).GetObjectID).killBackgroundProcesses(StringToJString('com.embarcadero.LocalBCR'));
  end;

А зачем StartService в KillApplication?

А где в вызове killBackgroundProcesses используется этот интент? — нигде.

Поэтому незачем.

Я же говорю — Осталось от предыдущего кода.

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


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

Подскажите, что нужно изменить в Ваших примерах, чтобы реагировать не на внутренние сообщения, а на внешние? Например, на звонки.

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


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

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

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

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

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

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

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

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

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


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

    • От Евгений Корепов
      Я написал класс для демонизации приложения в linux. Класс форкает процесс, обрабатывает поступающие сигналы и передает их в основной поток через потокобезопасную очередь.
      Исходники https://github.com/EvgeniyKorepov/LinuxDaemon
      Для использования просто подключите модуль UnitDaemon в свое консольное приложение:
      program DaemonTest; {$APPTYPE CONSOLE} uses System.SysUtils, System.IOUtils, System.SyncObjs, Posix.Stdlib, Posix.SysStat, Posix.SysTypes, Posix.Unistd, Posix.Signal, Posix.Fcntl, Posix.Syslog in 'Posix.Syslog.pas', UnitDaemon in 'UnitDaemon.pas'; var AEventType : TEventType; begin syslog(LOG_NOTICE, 'main START'); while True do begin syslog(LOG_NOTICE, 'main LOOP'); if UnitDaemon.QueueEvent.PopItem(AEventType) = System.SyncObjs.TWaitResult.wrSignaled then begin syslog(LOG_NOTICE, 'main UnitDaemon.QueueEvent.PopItem'); case AEventType of TEventType.StopProcess : begin syslog(LOG_NOTICE, 'main Event StopProcess'); ExitCode := EXIT_SUCCESS; exit; end; TEventType.Start : begin syslog(LOG_NOTICE, 'main Event START'); end; TEventType.Reload : begin // Reload config syslog(LOG_NOTICE, 'main Event RELOAD'); end; TEventType.Stop : begin syslog(LOG_NOTICE, 'main Event STOP'); ExitCode := EXIT_SUCCESS; exit; end; end; end; Sleep(50); end; end. Так же поддерживается systemd - для этого положите  DaemonTest.service в /etc/systemd/system/ и используйте :
      systemctl start DaemonTest.service systemctl reload DaemonTest.service systemctl stop DaemonTest.service  
    • От Евгений Корепов
      Вот просто идеальная статья по запуску демона под Linux http://blog.paolorossi.net/2017/09/04/building-a-real-linux-daemon-with-delphi-part-2/ 
      Помимо объяснения механизма fork с отличными примерами,  есть куча дополнительной наиполезнейшей инфы.
    • От 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, но служба при запуске зависает и падает.
       
       
  • Последние посетители   0 пользователей онлайн

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

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