Вот пример, из которого вы можете видеть как перехватывать звонки (добавьте на форму 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 компоненты.