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

Перехват события звонка


mader

Вопрос

Опубликовано

Здравствуйте, подскажите пожалуйста, есть ли такая библиотека или Апи, для перехвата звонков.

 

Необходимо следующее, когда пользователь звонит или ему звонят, необходимо отправить сигнал в PHP, В начале звонка и в конце звонка, а так же отправить номер телефона. кто звонил и кому звонили.

как-то так.

 

Возможно ли реализовать на Делфи? Установил себе XE8.

Не хотелось бы пистаь на Java? Там все как-то сложно, хотелось бы на Делфи.

 

 

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

  • 0
Опубликовано

Вот пример, из которого вы можете видеть как перехватывать звонки (добавьте на форму Memo)
 

uses
  CSBroadcastReceiver,
  Androidapi.JNI.JavaTypes.Own,

  Androidapi.Jni,
  AndroidApi.JNI.GraphicsContentViewText,
  Androidapi.Jni.JavaTypes,
  Androidapi.JNI.Os,
  Androidapi.JNIBridge,
  Androidapi.JNI.Telephony, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo,
  FMX.StdCtrls;

  private
    { Private declarations }
    procedure CreateBroadcastReceiver;
    procedure BroadcastReceiverOnReceive(csContext: JContext; csIntent: JIntent);
    procedure CheckPhoneCallState(Context: JContext; Intent: JIntent);
    procedure CheckSmsInState(Context: JContext; Intent: JIntent);
    function  KillCall(Context: JContext): Boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  BroadcastReceiver: TCSBroadcastReceiver;

implementation

uses
  Androidapi.Jni.App, Androidapi.Helpers, Androidapi.Log;


procedure TForm1.CreateBroadcastReceiver;
begin
  if not Assigned(BroadcastReceiver) then
    begin
      BroadcastReceiver:= TCSBroadcastReceiver.Create(nil);
      BroadcastReceiver.OnReceive:= BroadcastReceiverOnReceive;
      BroadcastReceiver.RegisterReceive;
      BroadcastReceiver.Add('android.intent.action.PHONE_STATE');
      BroadcastReceiver.Add('android.intent.action.NEW_OUTGOING_CALL');
    end;
end;

procedure TForm1.CheckPhoneCallState(Context: JContext; Intent: JIntent);
var
  telephonyService: JObject;
  telephonyManager: JTelephonyManager;
  state: JString;
  incomingCallNumber: string;
  outgoingCallNumber: string;
  outputResult: string;
begin
  outputResult:= #13#10;

  telephonyService := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
  telephonyManager := TJTelephonyManager.Wrap((telephonyService as ILocalObject).GetObjectID);

  if JStringToString(Intent.getAction).Equals('android.intent.action.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 ' + #13#10
      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' + #13#10;
          outputResult:= outputResult + 'Incoming call from ' + incomingCallNumber + #13#10;
          if incomingCallNumber = '+79391234567' then /// телефон в черном списке
            // тут отбиваем звонок
        end
      else if state.equals(TJTelephonyManager.JavaClass.EXTRA_STATE_OFFHOOK) then
        outputResult:= outputResult + 'Phone is OFFHOOK' + #13#10;
  end
  else if JStringToString(Intent.getAction).Equals('android.intent.action.NEW_OUTGOING_CALL') then
  begin
      outgoingCallNumber:= JStringToString(Intent.getStringExtra(TJIntent.JavaClass.EXTRA_PHONE_NUMBER));
      outputResult:= outputResult + 'Outgoing call to ' + outgoingCallNumber + #13#10;
      if outgoingCallNumber = '+79051234567' then /// телефон в черном списке
        begin
          BroadcastReceiver.SetResultData(nil);
          outputResult:= outputResult + 'Call is not allowed to ' + outgoingCallNumber + #13#10;
        end;

  end;

  Memo1.Lines.Append(outputResult);
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(BroadcastReceiver) then
    BroadcastReceiver.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CreateBroadcastReceiver;
end;

Отправить на PHP сервер можно, например, через Indy компоненты.

  • 0
Опубликовано (изменено)
 

Я реализовывал на делфи, с помощью джава сервиса, в котором юзал PhoneStateListener. Лучше делай как-то так :)

Блин, ну как-то не хотелось бы с джавой связываться. Я специально Delphi поставил, старался избежать эти Эклипсы и Анроид студии, какие-то они кривые, не понятные, глючат и ставятся непонятно, как мне кажется.для меня джава как НЛО, вроде летает, а как - фиг его знает. Может просто у меня мозгов мало, но в любом случае, Делфи мне нравится больше.

 

Rusland, а вот это уже классно, ща попробую.

 

НЕ, не работает. буду копать.

 

 

Изменено пользователем mader
  • 0
Опубликовано

 

 

Я реализовывал на делфи, с помощью джава сервиса, в котором юзал PhoneStateListener. Лучше делай как-то так :)

Блин, ну как-то не хотелось бы с джавой связываться. Я специально Delphi поставил, старался избежать эти Эклипсы и Анроид студии, какие-то они кривые, не понятные, глючат и ставятся непонятно, как мне кажется.для меня джава как НЛО, вроде летает, а как - фиг его знает. Может просто у меня мозгов мало, но в любом случае, Делфи мне нравится больше.

 

Rusland, а вот это уже классно, ща попробую.

 

НЕ, не работает. буду копать.

 

 

 

Нет ничего сложного на джаве. Там уже 99% реализовано.

  • 0
  • Администраторы
Опубликовано

Посмотрите уже готовый сервис IFMXPhoneDialerService, он умеет слушать сеть: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Mobile_Tutorial:_Using_the_Phone_Dialer_on_Mobile_Devices_(iOS_and_Android)

  • 0
Опубликовано

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

  • 0
Опубликовано
В 10.03.2016 в 01:45, Brovin Yaroslav сказал:

Посмотрите уже готовый сервис IFMXPhoneDialerService, он умеет слушать сеть: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Mobile_Tutorial:_Using_the_Phone_Dialer_on_Mobile_Devices_(iOS_and_Android)

 

Но это же не будет работать внутри сервиса?

  • 0
Опубликовано
В 09.03.2016 в 08:14, Rusland сказал:

mader, я забыл прикрепить файл CSBroadcastReceiver.pas

CSBroadcastReceiver.zip

1. Там нужно заменить Activity на Context везде. И тогда можно использовать в сервисах.

2. В NextGen нельзя использовать Destoy напрямую, поэтому код destructor TCSBroadcastReceiver.Destroy; нужно убрать, а вместо этого сделать отдельную процедуру для UnregisterReceiver.

 

  • 0
Опубликовано

@x11 удалось ли определить входящий вызов? Просмотрел все примеры, не получается определить номер. Где то читал, что сам гугл запретил или все таки есть возможность определить входящий номер?

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

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

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

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

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

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

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

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

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