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

Не работает IFMXPhoneDialerService?


DirtyBorov

Вопрос

Доброго времени.

Delphi Berlin. Попробовал воспроизвести пример http://docwiki.embarcadero.com/RADStudio/Seattle/en/Mobile_Tutorial:_Using_the_Phone_Dialer_on_Mobile_Devices_(iOS_and_Android)

Выяснилось что событие OnCallStateChanged не вызывается (Android). Пробовал пример из поставки. Просмотрел как описано в разных книгах - везде одно и тоже. Но не работает. 

Как же получить статус звонка?

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

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

  • 0

Что именно не работает?? Все работает. 

Предполагаю что вы столкнулись с невозможностью определения "было ли установлено соединения" если звоните вы. Так?

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

Что именно не работает?? Все работает. 

Предполагаю что вы столкнулись с невозможностью определения "было ли установлено соединения" если звоните вы. Так?

При любых звонках, в memo  падает только Phone is IDLE и Phone is OFFHOOK. Других сообщений нет.  На сколько я понял, факт установки соединения под Android не отловить. Или я не прав?

В идеале, хотелось бы отследить состояние исходящего звонка. Т.е. набор, соединение, отбой. 

Ссылка на комментарий
  • 0
25 минут назад, zairkz сказал:

Да в Android'е не отловить соединение если звонок делаете вы.

Могу скинуть костыль (действительно Костыль) но помогает пока

Был бы весьма признателен. Куда уж без костылей )

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

Вообщем так как андройд не поддерживает функцию определения соединения, сделал через журнал звонков

В Андройде после звонка если было соединение, время звонка будет больше нуля.

//PhoneDialerService.OnCallStateChanged := MyOnCallStateChanged;

На Disconnected проверяю журнал звонков, так как бывает не успевает падать информация использую таймер с интервалом 1 секунда, ниже приведен код в нем или iOS соединения и все ок или андройд на дисконекте и пуск таймера.

procedure TForm_Main.MyOnCallStateChanged(const ACallID: String; const ACallState: TCallState);
begin
  case ACallState of
    TCallState.Connected:
      begin 
{$IFDEF IOS} TThread.Synchronize(nil, ShowDialDialog); {$ENDIF}
      end;
    TCallState.Disconnected:
      begin
{$IFDEF ANDROID} TimerCallCheck.Enabled := true; {$ENDIF}
        PhoneDialerService.OnCallStateChanged := nil;
      end;
  end;
end;

Пока не добавил такую архитектуру с ТТаском и Синхронизацией были иногда вылеты приложения

procedure TForm_Main.TimerCallCheckTimer(Sender: TObject);
begin
  TimerCallCheck.Enabled := false;
  TTask.Run(
    procedure
    var
      Dur: Int64;
    begin
      Dur := CheckStat; //Функция проверки журнала
      TThread.Synchronize(nil,
        procedure
        begin
          if Dur = -1 then 
            TimerCallCheck.Enabled := true
          else
          begin
            TimerCallCheck.Enabled := false;
            if Dur > 0 then
              ShowDialDialog; //Вызывается форма у меня в приложении
          end;
        end);
    end);
end;

 

function TForm_Main.CheckStat: Int64;
var
  cursor: JCursor;
  Dtime, CallDuration: Int64;
  JsortOrder, JSelection: String;
  wJQueryParams: TJavaObjectArray<JString>;
begin
  Result := 0;
  wJQueryParams := TJavaObjectArray<JString>.Create(4);
  wJQueryParams[0] := TJCallLog_Calls.JavaClass.CACHED_NAME;
  wJQueryParams[1] := TJCallLog_Calls.JavaClass.NUMBER;
  wJQueryParams[2] := TJCallLog_Calls.JavaClass.DURATION;
  wJQueryParams[3] := TJCallLog_Calls.JavaClass.DATE;

  JsortOrder := 'date DESC LIMIT 1';
  Dtime := (DateTimeToUnix(Now, true) - 360) * 1000;  //Последние пять минут
  JSelection := 'number = "+77017017708" AND type = 2 AND date > ' + IntToStr(Dtime);

  cursor := TAndroidHelper.Activity.getContentResolver.query(TJCallLog_Calls.JavaClass.CONTENT_URI, wJQueryParams,
    StringToJString(JSelection), nil, StringToJString(JsortOrder));
  if (cursor.getCount > 0) then
  begin
    while (cursor.moveToNext) do
    begin
      CallDuration := StrToInt64(JStringToString(cursor.getString(cursor.getColumnIndex(TJCallLog_Calls.JavaClass.DURATION))));
      Result := CallDuration;
    end;
  end
  else
    Result := -1;
  cursor.Close;
  FreeAndNil(wJQueryParams);
end;

 

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

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

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