【发布时间】:2020-04-14 19:35:54
【问题描述】:
我设法获得了 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;
【问题讨论】:
-
请提供minimal reproducible example。如果不确切知道自己在做什么,就很难知道问题出在哪里
-
添加代码到帖子
-
为什么要调用
PlatformServices.Current.SupportsPlatformService()两次来分配相同的PhoneDialerService变量?你应该摆脱其中一项任务。我会建议第一个,并将第二个移到您的匿名程序中。除非您首先被授予权限,否则不应分配OnCallStateChanged处理程序。 -
感谢您的回复。第二个 PhoneDialerService 是错误的。在 if 语句之前的匿名过程中添加了 PhoneDialer 服务。授予权限后移动 OnCallStateChanged。还在 TForm.Create 之前移动了 MyOnCallStatement 过程。但仍然无法获得手机状态的变化。可以拨打电话并获取运营商信息。
-
如果这不起作用,另一种方法是使用 Android API 代码实现
PhoneStateListener。