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

Вопросы

На основе нескольких тем форума сделал службу перехвата звонков и номера телефона.

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
замена примера на более удачный вариант

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


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

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

  • 0

При остановке службы получаю исключение

Project Host.apk raised exception class Segmentation fault (11).

на строке BroadcastReceiver := nil;

 

procedure TDMSrv.BroadCastReiverFree;
begin
  if Assigned(BroadcastReceiver) then
  begin
    BroadcastReceiver.Destroy;
    BroadcastReceiver := nil;
  end;
end;

хотя при отладке видно, что BroadcastReceiver равен nil, но assigned всё равно возвращает True.

Screenshot_1.png

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


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

Проблема вот в чем. Событие о входящем звонке срабатывает 2 раза.

Об исходящем нормально - 1 раз. Не могу понять, что не так :(

http://fire-monkey.ru/topic/4740-broadcastreceiveronreceive-срабазывает-2-раза/

 

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

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


Ссылка на сообщение
  • 0
20 часов назад, x11 сказал:

Проблема вот в чем. Событие о входящем звонке срабатывает 2 раза.

Сегодня в разговоре с андроид-разработчиком (Android studio) узнал, что и у него тоже это событие срабатывает 2 раза.

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


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

Вопрос по Андроиду 6 и выше.

Оказалось, что служба с  BroadcastReceiver`ом не получает сообщения, если в targetSdkVersion указать версию 24 или 25.

Если указываешь не выше 22, то получает и срабатывает. С чем это связано может быть? Нет ошибок, просто BroadcastReceiver не получает сообщения.

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

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


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

х11, боьшое тебе спасибо за пример!

Прикрутил к нему возможность отправлять номер при входящем звонке на комп в виде get-запроса. Столкнулся с проблемой. IP адрес устройства, на который будет отправляться get-запрос приходится прописывать в uDMSrv модуле и перекомпилировать каждый раз. Хотелось бы сделать Edit в uHost, в который можно вписать IP адрес в интерфейсе приложения. Можешь ли подсказать как сделать чтобы uDMSrv модуль мог подхватывать значение из uHost модуля, из Edit-a например?

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


Ссылка на сообщение
  • 0
В 22.02.2018 в 16:12, x11 сказал:

Вопрос по Андроиду 6 и выше.

Оказалось, что служба с  BroadcastReceiver`ом не получает сообщения, если в targetSdkVersion указать версию 24 или 25.

Если указываешь не выше 22, то получает и срабатывает. С чем это связано может быть? Нет ошибок, просто BroadcastReceiver не получает сообщения.

В общем, это связано с тем, что в новых андроидах проверка прав приложения происходит непосредственно при выполнении той или иной функции, которая требует этих прав. Поэтому нужно при выполнении этой функции обрабатывать запрос прав.

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


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

qubasesx, вписывай IP в любой форме и сохраняй куда-нибудь, например в базу, а из DataModule читай из базы.

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


Ссылка на сообщение
  • 0
В 15.12.2018 в 16:14, qubasesx сказал:

х11, боьшое тебе спасибо за пример!

Прикрутил к нему возможность отправлять номер при входящем звонке на комп в виде get-запроса. Столкнулся с проблемой. IP адрес устройства, на который будет отправляться get-запрос приходится прописывать в uDMSrv модуле и перекомпилировать каждый раз. Хотелось бы сделать Edit в uHost, в который можно вписать IP адрес в интерфейсе приложения. Можешь ли подсказать как сделать чтобы uDMSrv модуль мог подхватывать значение из uHost модуля, из Edit-a например?

Сохранить в файл используя: Ini/Json/Xml/Plain Text

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


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

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

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


Ссылка на сообщение
  • 0
В 17.12.2018 в 19:12, Равиль Зарипов (ZuBy) сказал:

Сохранить в файл используя: Ini/Json/Xml/Plain Text

Спасибо! Реализовал задумку через сохранение в файл ini. Использовал конструкцию: fileAdres := TPath.Combine(TPath.GetSharedDocumentsPath, 'Settings.ini');

Для работы этого нужно добавить System.IOUtils в uses.

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


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

А вот ещё такой вопрос, как сделать так чтобы при входящим или исходящем звонке выполнялось какое-нибудь действие в главной форме? Ну например менялось свойство Text компонента Label, или выполнялась какая-нить процедура типа Button1Click(Sender); ?

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


Ссылка на сообщение
  • 0
16 часов назад, qubasesx сказал:

А вот ещё такой вопрос, как сделать так чтобы при входящим или исходящем звонке выполнялось какое-нибудь действие в главной форме?

Ну так об этом как раз в этой теме и идёт речь

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


Ссылка на сообщение
  • 0
47 минут назад, x11 сказал:

Ну так об этом как раз в этой теме и идёт речь

Вы имеете ввиду что единственный вариант это сделать - через значение, которое передавать через текстовый файл например, в в основной форме по таймеру опрашивать значение какой-то строки файла?

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


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

я уже не помню, но туту нужно погуглить/поспрашивать, как передавать данные между андроидовскими службами и приложениями

тут тоже есть примеры и описания

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


Ссылка на сообщение
  • 0
8 часов назад, qubasesx сказал:

Вы имеете ввиду что единственный вариант это сделать - через значение, которое передавать через текстовый файл например, в в основной форме по таймеру опрашивать значение какой-то строки файла?

Описать BroadcastReceiver в приложении, а из сервиса слать сообщение (интент) с необходимыми данными.

На форуме есть пример даже с сервисом 

 

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


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

 

В 16.12.2018 в 16:13, x11 сказал:

В общем, это связано с тем, что в новых андроидах проверка прав приложения происходит непосредственно при выполнении той или иной функции, которая требует этих прав. Поэтому нужно при выполнении этой функции обрабатывать запрос прав.

Не могли бы показать на примере как обрабатывать запрос прав?

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


Ссылка на сообщение
  • 0
11 часов назад, x11 сказал:

поищи по форуму или погугли - был пример готовый

Спасибо разобрался. Сервис реагирует на входящие вызовы, но почему то не может прочесть входящий номер. Подозреваю, что для этого также нужно дать права доступа. Разрешаю доступ на READ_PHONE_NUMBERS, но все равно не считывает номер. Может какие то другие права нужно дать? Подскажите пожалуйста. 

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


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

Помогите пожалуйста! При компилировании выходит ошибка:
[Exec Error] The command ""C:\Program Files\Java\jdk1.8.0_60\bin\jar" cf ".\Android\Debug\CallerIdSrv.jar" -C "\\Mac\Home\Documents\1111\BR2\srv\JavaClasses\CallerIdSrv" ." exited with code 1.

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


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

Не старайтесь. В новых версиях Андроида Гугл запретил перехват номеров.

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


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

У меня есть уже приложение на Delphi 10 и перехват работает (Samsung 8, Android 9), но только если включено питание к телефону. Как понял, нужно чтобы был запущен сервис и вот нашел ваш проект. Я правильно понимаю, что этот проект может выполнить перехват звонка если телефон не подключен к питанию, т.е выполняться как сервис? Если да, то помогите избавиться от ошибки отправленной мной выше. 

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


Ссылка на сообщение
  • 0
15 минут назад, ТАГИР Тагирович сказал:

Я правильно понимаю, что этот проект может выполнить перехват звонка если телефон не подключен к питанию

Нет. Проект старый, может работать для Андроид 4-5 и не будет работать для Андроида 6 или выше. В Андроид 6 или 7 Гугл добавила "динамические права", т.е. запрос выскакивает прямо посреди работы приложения. А старые версии FMX эти запросы обрабатывать не умеют. Я проект делал на Berlin`е.

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


Ссылка на сообщение
  • 0
18 минут назад, ТАГИР Тагирович сказал:

перехват работает (Samsung 8, Android 9), но только если включено питание к телефону

Ну и нафиг оно такое надо? Не факт ,что будет нормально работать на китайских поделках а-ля Хуйвей или Сяоми, где права урезаны ещё жесче.

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


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

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

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

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

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

  Разрешено использовать не более 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
      Заметил, что после удаления библиотеки-сервиса всё равно в 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 пользователей онлайн

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

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