android - Delphi Android READ_PHONE_STATE 未触发
问题描述
我设法获得 READ_PHONE_STATE 的运行时权限,但应用程序根本不会对手机状态更改做出反应。我还在清单文件中启用了 READ_PHONE_STATE。
已尝试使用 3 部 Android 手机,但都无法跟踪状态更改。
在 iOS 中,我设法让 READ_PHONE_STATE 使用与我在 Android 上尝试过的代码相同的代码,但在 iOS 中,Apple 已弃用显示来电者电话号码。
uses
System.Permissions;
{$R *.fmx}
constructor TForm1.Create(AOwner: TComponent);
const
PermissionAccessReadPhoneState = 'android.permission.READ_PHONE_STATE';
PermissionAccessMakeCall = 'android.permission.CALL_PHONE';
begin
inherited Create(AOwner);
TPlatformServices.Current.SupportsPlatformService(IFMXPhoneDialerService, IInterface(PhoneDialerService));
PermissionsService.RequestPermissions([PermissionAccessMakeCall, PermissionAccessReadPhoneState],
procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TpermissionStatus>)
begin
if (Length(AgrantResults) = 2) and (AgrantResults[0] = TPermissionStatus.Granted) and (AgrantResults[1] = TPermissionStatus.Granted) then
begin
ShowMessage('READ_PHONE_STATE + CALL_PHONE Activated!');
end;
end);
if Assigned(PhoneDialerService) then
begin
PhoneDialerService.OnCallStateChanged := MyOnCallStateChanged;
end;
end;
procedure TForm1.MyOnCallStateChanged(const ACallID: String;
const ACallState: TCallState);
var
outText: String;
begin
case ACallState of
TCallState.None: outText := 'No calls';
TCallState.Connected: outText := 'Connected';
TCallState.Incoming: outText := 'Incoming Call';
TCallState.Dialing: outText := 'Dialing';
TCallState.Disconnected: outText := 'Disconnected';
end;
lblCallState.Text := outText;
end;
解决方案
uses
Androidapi.JNI.Telephony;
type
TPhoneStateListener = class;
TfrmTabbed = class(TForm)
HeaderToolBar: TToolBar;
ToolBarLabel: TLabel;
TabControl1: TTabControl;
...
private
{ Private declarations }
PhoneStateListener: TPhoneStateListener;
...
end;
TPhoneStateListener = class(TJavaLocal, JICustomPhoneStateListener)
private
[weak]
FParent : TfrmTabbed;
public
constructor Create(AParent : TfrmTabbed);
procedure onCallForwardingIndicatorChanged(cfi: Boolean); cdecl;
procedure onCallStateChanged(state: Integer; incomingNumber: JString); cdecl;
procedure onCellInfoChanged(cellInfo: JList); cdecl;
procedure onCellLocationChanged(location: JCellLocation); cdecl;
procedure onDataActivity(direction: Integer); cdecl;
procedure onDataConnectionStateChanged(state: Integer); overload; cdecl;
procedure onDataConnectionStateChanged(state: Integer; networkType: Integer); overload; cdecl;
procedure onMessageWaitingIndicatorChanged(mwi: Boolean); cdecl;
procedure onServiceStateChanged(serviceState: JServiceState); cdecl;
procedure onSignalStrengthChanged(asu: Integer); cdecl;
procedure onSignalStrengthsChanged(signalStrength: JSignalStrength); cdecl;
end;
procedure TfrmTabbed.FormShow(Sender: TObject);
var
obj: JObject;
begin
if PhoneStateListener = nil then
PhoneStateListener := TPhoneStateListener.Create(Self);
obj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
if obj = nil then
raise Exception.Create('Telephony service not supported');
CallinUIThread(procedure
var
TelephonyManager: JTelephonyManager;
PSL: JCustomPhoneStateListener;
begin
TelephonyManager := TJTelephonyManager.Wrap(obj);
PSL := TJCustomPhoneStateListener.JavaClass.init(PhoneStateListener);
TelephonyManager.listen(PSL,
TJPhoneStateListener.JavaClass.LISTEN_CALL_STATE
);
end
);
{ TPhoneStateListener }
constructor TPhoneStateListener.Create(AParent: TfrmTabbed);
begin
inherited Create;
FParent := AParent;
end;
procedure TPhoneStateListener.onCallForwardingIndicatorChanged(cfi: Boolean);
begin
end;
procedure TPhoneStateListener.onCallStateChanged(state: Integer;
incomingNumber: JString);
begin
if state = TJTelephonyManager.JavaClass.CALL_STATE_IDLE then
begin
end
else if state = TJTelephonyManager.JavaClass.CALL_STATE_OFFHOOK then
begin
end
else if state = TJTelephonyManager.JavaClass.CALL_STATE_RINGING then
begin
end;
end;
procedure TPhoneStateListener.onCellInfoChanged(cellInfo: JList);
begin
end;
procedure TPhoneStateListener.onCellLocationChanged(location: JCellLocation);
begin
end;
procedure TPhoneStateListener.onDataActivity(direction: Integer);
begin
end;
procedure TPhoneStateListener.onDataConnectionStateChanged(state: Integer);
begin
end;
procedure TPhoneStateListener.onDataConnectionStateChanged(state: Integer; networkType: Integer);
begin
end;
procedure TPhoneStateListener.onMessageWaitingIndicatorChanged(mwi: Boolean);
begin
end;
procedure TPhoneStateListener.onServiceStateChanged(serviceState: JServiceState);
begin
end;
procedure TPhoneStateListener.onSignalStrengthChanged(asu: Integer);
begin
end;
procedure TPhoneStateListener.onSignalStrengthsChanged(signalStrength: JSignalStrength);
begin
end;
推荐阅读
- r - 将未来的进展或从承诺传回主流程?
- reactjs - 在反应中按匹配搜索并仅输出匹配的元素
- azure - Azure Blob 存储更改现有容器的加密范围
- hadoop-yarn - Oozie 和 Yarn 延迟提交申请
- javascript - 在javascript中从数组的数组列表中获取JSON数据
- android - 当我在表单验证中执行一项任务时,我如何在颤振 null 安全中修复此错误
- windows - ReadConsoleA 在程序集中的函数内部崩溃
- python - 如何在python中将值插入二维数组
- python - Flask Flash 消息未在按钮单击时显示
- sql - 使用按帐号分区的先前值填充列