DELPHI XE 10 拒接来电黑名单

这篇博客介绍了如何在DELPHI XE10中创建一个广播接收器来监听电话状态,实现拒接特定来电的功能。通过注册BroadcastReceiver并处理'android.intent.action.PHONE_STATE'和'android.intent.action.NEW_OUTGOING_CALL'事件,当来电号码匹配预设的黑名单时,程序会挂断电话。同时,对于拨出的电话,如果号码匹配到特定值,也会阻止拨出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值