unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo,
CSBroadcastReceiver,
Androidapi.JNI.JavaTypes.Own,
AndroidApi.JNI.GraphicsContentViewText,
Androidapi.Jni.JavaTypes,
Androidapi.JNI.Os,
Androidapi.JNIBridge,
Androidapi.JNI.Telephony;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure CreateBroadcastReceiver;
procedure BroadcastReceiverOnReceive(csContext: JContext; csIntent: JIntent);
procedure CheckPhoneCallState(Context: JContext; Intent: JIntent);
function KillCall(Context: JContext): Boolean;
public
{ Public declarations }
end;
var
Form1: TForm1;
BroadcastReceiver: TCSBroadcastReceiver;
implementation
{$R *.fmx}
uses
Androidapi.Jni.App, Androidapi.Helpers, Androidapi.Log;
procedure TForm1.BroadcastReceiverOnReceive(csContext: JContext;
csIntent: JIntent);
begin
CheckPhoneCallState(csContext, csIntent);
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 = '1371510XXXX' then //要屏蔽的电话号码
if KillCall(Context) then
outputResult:= outputResult + 'Call was terminated' + #13#10
else
outputResult:= outputResult + 'Call was not terminated' + #13#10;
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 = 'xyz' then
begin
BroadcastReceiver.SetResultData(nil);
outputResult:= outputResult + 'Call is not allowed to ' + outgoingCallNumber + #13#10;
end;
end;
Memo1.Lines.Append(outputResult);
end;
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.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Assigned(BroadcastReceiver) then
BroadcastReceiver.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CreateBroadcastReceiver;
end;
function TForm1.KillCall(Context: JContext): Boolean;
var
telephonyService: JObject;
classTelephony: JOwnLang_Class;
methodGetITelephony: JOwnMethod;
telephonyInterface: JObject;
telephonyInterfaceClass: JOwnLang_Class;
methodEndCall: JOwnMethod;
begin
try
telephonyService:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
classTelephony := TJOwnLang_Class.JavaClass.forName(telephonyService.getClass.getName);
methodGetITelephony:= classTelephony.getDeclaredMethod(StringToJString('getITelephony'), nil);
methodGetITelephony.setAccessible(True);
telephonyInterface := methodGetITelephony.invoke(telephonyService, nil);
telephonyInterfaceClass := TJOwnLang_Class.JavaClass.forName(telephonyInterface.getClass.getName);
methodEndCall:= telephonyInterfaceClass.getDeclaredMethod(StringToJString('endCall'), nil);
methodEndCall.invoke(telephonyInterface, nil);
Result:= True;
except
on E: Exception do
begin
Result := False;
end;
end;
end;
end.
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo,
CSBroadcastReceiver,
Androidapi.JNI.JavaTypes.Own,
AndroidApi.JNI.GraphicsContentViewText,
Androidapi.Jni.JavaTypes,
Androidapi.JNI.Os,
Androidapi.JNIBridge,
Androidapi.JNI.Telephony;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure CreateBroadcastReceiver;
procedure BroadcastReceiverOnReceive(csContext: JContext; csIntent: JIntent);
procedure CheckPhoneCallState(Context: JContext; Intent: JIntent);
function KillCall(Context: JContext): Boolean;
public
{ Public declarations }
end;
var
Form1: TForm1;
BroadcastReceiver: TCSBroadcastReceiver;
implementation
{$R *.fmx}
uses
Androidapi.Jni.App, Androidapi.Helpers, Androidapi.Log;
procedure TForm1.BroadcastReceiverOnReceive(csContext: JContext;
csIntent: JIntent);
begin
CheckPhoneCallState(csContext, csIntent);
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 = '1371510XXXX' then //要屏蔽的电话号码
if KillCall(Context) then
outputResult:= outputResult + 'Call was terminated' + #13#10
else
outputResult:= outputResult + 'Call was not terminated' + #13#10;
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 = 'xyz' then
begin
BroadcastReceiver.SetResultData(nil);
outputResult:= outputResult + 'Call is not allowed to ' + outgoingCallNumber + #13#10;
end;
end;
Memo1.Lines.Append(outputResult);
end;
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.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Assigned(BroadcastReceiver) then
BroadcastReceiver.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CreateBroadcastReceiver;
end;
function TForm1.KillCall(Context: JContext): Boolean;
var
telephonyService: JObject;
classTelephony: JOwnLang_Class;
methodGetITelephony: JOwnMethod;
telephonyInterface: JObject;
telephonyInterfaceClass: JOwnLang_Class;
methodEndCall: JOwnMethod;
begin
try
telephonyService:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
classTelephony := TJOwnLang_Class.JavaClass.forName(telephonyService.getClass.getName);
methodGetITelephony:= classTelephony.getDeclaredMethod(StringToJString('getITelephony'), nil);
methodGetITelephony.setAccessible(True);
telephonyInterface := methodGetITelephony.invoke(telephonyService, nil);
telephonyInterfaceClass := TJOwnLang_Class.JavaClass.forName(telephonyInterface.getClass.getName);
methodEndCall:= telephonyInterfaceClass.getDeclaredMethod(StringToJString('endCall'), nil);
methodEndCall.invoke(telephonyInterface, nil);
Result:= True;
except
on E: Exception do
begin
Result := False;
end;
end;
end;
end.