Перейти к содержанию
Fire Monkey от А до Я
  • 1

Служба + перехват номера


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

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

  • 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
  • 1
Опубликовано
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
  • Модераторы
Опубликовано
В 15.12.2018 в 16:14, qubasesx сказал:

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

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

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

  • 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
Опубликовано

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

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

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

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

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

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

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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить на вопрос...

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

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

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

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

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

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