DirtyBorov Опубликовано 14 августа, 2016 Поделиться Опубликовано 14 августа, 2016 Доброго времени. Delphi Berlin. Попробовал воспроизвести пример http://docwiki.embarcadero.com/RADStudio/Seattle/en/Mobile_Tutorial:_Using_the_Phone_Dialer_on_Mobile_Devices_(iOS_and_Android) Выяснилось что событие OnCallStateChanged не вызывается (Android). Пробовал пример из поставки. Просмотрел как описано в разных книгах - везде одно и тоже. Но не работает. Как же получить статус звонка? Цитата Ссылка на комментарий
0 Rusland Опубликовано 15 августа, 2016 Поделиться Опубликовано 15 августа, 2016 В этой теме был пример Kitty 1 Цитата Ссылка на комментарий
0 DirtyBorov Опубликовано 15 августа, 2016 Автор Поделиться Опубликовано 15 августа, 2016 6 часов назад, Rusland сказал: В этой теме был пример Конечно же я его смотрел. И он даже работает. Частично правда. Но все же.. разбираюсь. Спасибо Цитата Ссылка на комментарий
0 zairkz Опубликовано 16 августа, 2016 Поделиться Опубликовано 16 августа, 2016 (изменено) Что именно не работает?? Все работает. Предполагаю что вы столкнулись с невозможностью определения "было ли установлено соединения" если звоните вы. Так? Изменено 16 августа, 2016 пользователем zairkz Цитата Ссылка на комментарий
0 DirtyBorov Опубликовано 16 августа, 2016 Автор Поделиться Опубликовано 16 августа, 2016 3 часа назад, zairkz сказал: Что именно не работает?? Все работает. Предполагаю что вы столкнулись с невозможностью определения "было ли установлено соединения" если звоните вы. Так? При любых звонках, в memo падает только Phone is IDLE и Phone is OFFHOOK. Других сообщений нет. На сколько я понял, факт установки соединения под Android не отловить. Или я не прав? В идеале, хотелось бы отследить состояние исходящего звонка. Т.е. набор, соединение, отбой. Цитата Ссылка на комментарий
0 zairkz Опубликовано 16 августа, 2016 Поделиться Опубликовано 16 августа, 2016 Да в Android'е не отловить соединение если звонок делаете вы. Могу скинуть костыль (действительно Костыль) но помогает пока Цитата Ссылка на комментарий
0 DirtyBorov Опубликовано 16 августа, 2016 Автор Поделиться Опубликовано 16 августа, 2016 25 минут назад, zairkz сказал: Да в Android'е не отловить соединение если звонок делаете вы. Могу скинуть костыль (действительно Костыль) но помогает пока Был бы весьма признателен. Куда уж без костылей ) Цитата Ссылка на комментарий
0 zairkz Опубликовано 16 августа, 2016 Поделиться Опубликовано 16 августа, 2016 (изменено) Вообщем так как андройд не поддерживает функцию определения соединения, сделал через журнал звонков В Андройде после звонка если было соединение, время звонка будет больше нуля. //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; Изменено 16 августа, 2016 пользователем zairkz rareMax, enatechno, Andrey Efimov и 4 других 7 Цитата Ссылка на комментарий
0 zairkz Опубликовано 16 августа, 2016 Поделиться Опубликовано 16 августа, 2016 uses Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.App, Androidapi.JNI.JavaTypes, Androidapi.JNIBridge, Androidapi.JNI.Provider; Rusland, DirtyBorov, Andrey Efimov и 1 другой 4 Цитата Ссылка на комментарий
0 DirtyBorov Опубликовано 17 августа, 2016 Автор Поделиться Опубликовано 17 августа, 2016 Очень интересная идея. Спасибо! Буду пробовать zairkz 1 Цитата Ссылка на комментарий
Вопрос
DirtyBorov
Доброго времени.
Delphi Berlin. Попробовал воспроизвести пример http://docwiki.embarcadero.com/RADStudio/Seattle/en/Mobile_Tutorial:_Using_the_Phone_Dialer_on_Mobile_Devices_(iOS_and_Android)
Выяснилось что событие OnCallStateChanged не вызывается (Android). Пробовал пример из поставки. Просмотрел как описано в разных книгах - везде одно и тоже. Но не работает.
Как же получить статус звонка?
Ссылка на комментарий
9 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.