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

BroadcastReceiver.OnReceive срабазывает 2 раза


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;

 

Screenshot_1.png

Изменено пользователем x11
Ссылка на комментарий

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

  • 0
  • Администраторы

Что-то мне кажется, если подпись идет на два типа событий: "отслеживание входящего звонка" и "смена состояния телефона", то логично, что событие срабатывает два раза.

Ссылка на комментарий
  • 0

Проблема в том, что и код добавления записи в базу "InsertTel(incomingCallNumber, True);" тоже срабатывает дважды.

Да и обратите внимание, что срабатывает одно и то же событие дважды - PHONE_STATE

Изменено пользователем x11
Ссылка на комментарий
  • 0
  • 0
9 часов назад, Brovin Yaroslav сказал:

Пробовали регистрировать ресивер не программно, а через манифест файл?

Пробовал когда-то. Но я не знаю, какую мою процедуру прописывать в манифест. Ведь мои процедуры работают внутри FMX и Android их не видит.

Ссылка на комментарий
  • 0
9 часов назад, Brovin Yaroslav сказал:

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


Проверял.

14 часа назад, x11 сказал:

Проверял: создается только один BroadcastReceiver.

 

ещё раз перепроверю

Ссылка на комментарий
  • 0
В 31.01.2018 в 23:41, Brovin Yaroslav сказал:

"отслеживание входящего звонка" и "смена состояния телефона", то логично, что событие срабатывает два раза.

Событие "android.intent.action.PHONE_STATE" - это и есть отслеживание входящего звонка, т.е. смена состояния телефона.  Других событий для отслеживания входящего звонка вроде бы нету. Если есть, подскажите решение. Спасибо.

Ссылка на комментарий
  • 0
В 31.01.2018 в 23:55, Brovin Yaroslav сказал:

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

http://blog.mmarvick.com/blog/lollipop-multiple-broadcastreceiver-call-state/

это проблема андроида

Screenshot_1.png

Ссылка на комментарий

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

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

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

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

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

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

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

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

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