Вообщем так как андройд не поддерживает функцию определения соединения, сделал через журнал звонков
В Андройде после звонка если было соединение, время звонка будет больше нуля.
//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;