Перейти к содержанию
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
В 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 эмодзи.

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

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

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

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