Android delphi firemonkey中PhoneStateListener侦听OnCellinformed的问题
Android delphi firemonkey中PhoneStateListener侦听OnCellinformed的问题,android,delphi,firemonkey,telephonymanager,phone-state-listener,Android,Delphi,Firemonkey,Telephonymanager,Phone State Listener,如果你能帮助我,我将不胜感激。我正在用delphi firemonkey编写一个程序,显示手机信息。我需要使用JPhoneStateListener类监听单元格信息的更改。 首先,我为ImplementMain类编写了一个类,如下所示: type TPL = class(TJavaGenericImport<JPhoneStateListenerClass, JPhoneStateListener>) public construc
如果你能帮助我,我将不胜感激。我正在用delphi firemonkey编写一个程序,显示手机信息。我需要使用JPhoneStateListener类监听单元格信息的更改。
首先,我为ImplementMain类编写了一个类,如下所示:
type
TPL = class(TJavaGenericImport<JPhoneStateListenerClass, JPhoneStateListener>)
public
constructor create;
Destructor Destroy; Override;
procedure onCallForwardingIndicatorChanged(cfi: Boolean); cdecl;
procedure onCallStateChanged(state: Integer; incomingNumber: JString); cdecl;
......... (and other procedures of main class)
end;
Implementation
Constructor TPL.Create;
Begin
End;
Destructor TPL.Destroy;
Begin
Inherited Destroy;
End;
procedure TPL.onCallForwardingIndicatorChanged(cfi: Boolean);
Begin
End;
.........
感谢@nolaspeaker
我编辑我的代码如下:
unit main;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, FMX.ExtCtrls, FMX.Helpers.Android, RTL.Controls,
Androidapi.JNI.Os, Androidapi.Helpers, Androidapi.JNI.Telephony,
Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes,
Androidapi.JNIBridge, Androidapi.JNI.App;
type
TPhoneStateListener = class;
TForm1 = class(TForm)
Button1: TButton;
RTLFixer1: TRTLFixer;
Memo1: TMemo;
Timer1: TTimer;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Timer1Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure InitPSListener(Start: Boolean);
private
PhoneStateListener: TPhoneStateListener;
FSignal: Integer;
{ Private declarations }
public
{ Public declarations }
end;
//type
TPhoneStateListener = class(TJavaLocal, JICustomPhoneStateListener)
private
[weak]
FParent : TForm1;
public
constructor Create(AParent : TForm1);
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;
var
Form1: TForm1;
implementation
{$R *.fmx}
{$R *.NmXhdpiPh.fmx ANDROID}
{$R *.LgXhdpiPh.fmx ANDROID}
procedure TForm1.Button1Click(Sender: TObject);
begin
InitPSListener(True);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
InitPSListener(False);
end;
procedure TForm1.InitPSListener(Start: Boolean);
var
obj: JObject;
begin
if PhoneStateListener = nil then
PhoneStateListener := TPhoneStateListener.Create(Self);
obj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
if obj <> nil then
begin
CallinUIThread(procedure
var
TelephonyManager: JTelephonyManager;
PSL: JCustomPhoneStateListener;
begin
TelephonyManager := TJTelephonyManager.Wrap(obj);
PSL := TJCustomPhoneStateListener.JavaClass.init(PhoneStateListener);
if Start then
TelephonyManager.listen(PSL,
TJPhoneStateListener.JavaClass.LISTEN_SIGNAL_STRENGTHS)
// or TJPhoneStateListener.JavaClass.LISTEN_SIGNAL_STRENGTH
// or TJPhoneStateListener.JavaClass.LISTEN_DATA_ACTIVITY
else
TelephonyManager.listen(PSL,
TJPhoneStateListener.JavaClass.LISTEN_NONE)
end
);
end;
end;
{ TPhoneStateListener }
constructor TPhoneStateListener.Create(AParent: TForm1);
begin
inherited Create;
FParent := AParent;
end;
procedure TPhoneStateListener.onCallForwardingIndicatorChanged(cfi: Boolean);
begin
end;
procedure TPhoneStateListener.onCallStateChanged(state: Integer;
incomingNumber: JString);
begin
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,
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
FParent.onSignalStrengthsChanged(signalStrength); <---- error is here
end;
procedure TForm1.OnSignalStrengthsChanged(signalStrength: JSignalStrength);
begin
FSignal := signalStrength.getLevel; // 0 - 4 <----- and is here
end;
end.
unitmain;
接口
使用
System.SysUtils、System.TYPE、System.UITYPE、System.Classes、System.VARIANT、,
FMX.类型,FMX.控件,FMX.窗体,FMX.图形,FMX.对话框,FMX.StdCtrls,
FMX.Controls.Presentation、FMX.ScrollBox、FMX.Memo、FMX.ExtCtrls、FMX.Helpers.Android、RTL.Controls、,
Androidapi.JNI.Os,Androidapi.Helpers,Androidapi.JNI.Telephony,
Androidapi.JNI.GraphicsContentViewText,Androidapi.JNI.JavaTypes,
Androidapi.JNIBridge,Androidapi.JNI.App;
类型
TPhoneStateListener=class;
TForm1=类(TForm)
按钮1:t按钮;
RTLFixer1:TRTLFixer;
备忘录1:TMemo;
定时器1:TTimer;
按钮2:t按钮;
程序按钮1点击(发送方:ToObject);
过程FormCloseQuery(发送方:ToObject;变量CanClose:布尔);
程序定时器1定时器(发送方:TObject);
程序按钮2点击(发送者:对象);
过程InitPSListener(开始:布尔值);
私有的
PhoneStateListener:TPhoneStateListener;
FSignal:整数;
{私有声明}
公众的
{公开声明}
结束;
//类型
TPhoneStateListener=class(TJavaLocal,JICustomPhoneStateStener)
私有的
[微弱]
家长:TForm1;
公众的
构造函数创建(AParent:TForm1);
一旦调用ForwardingIndicator更改时的过程(cfi:布尔值);cdecl;
过程onCallStateChanged(状态:整数;incomingNumber:JString);cdecl;
更改了cellInfo的程序(cellInfo:JList);cdecl;
更改了CellLocation的程序(位置:JCellLocation);cdecl;
过程onDataActivity(方向:整数);cdecl;
过程onDataConnectionStateChanged(状态:整数);超载;cdecl;
过程onDataConnectionStateChanged(状态:整数;网络类型:整数);超载;cdecl;
消息编辑指示或更改的过程(mwi:布尔值);cdecl;
serviceState上的过程已更改(serviceState:JServiceState);cdecl;
信号强度更改程序(asu:整数);cdecl;
信号强度程序更改(信号强度:J信号强度);cdecl;
结束;
变量
表1:TForm1;
实施
{$R*.fmx}
{$R*.nmxhdiph.fmx ANDROID}
{$R*.lgxhdiph.fmx ANDROID}
程序TForm1.按钮1单击(发送方:TObject);
开始
InitPSListener(True);
结束;
程序TForm1.按钮2单击(发送方:TObject);
开始
InitPSListener(False);
结束;
过程TForm1.InitPSListener(开始:布尔值);
变量
obj:JObject;
开始
如果PhoneStateListener=nil,则
PhoneStateListener:=TPhoneStateListener.Create(Self);
obj:=TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_服务);
如果对象为零,则
开始
CallinUIThread(程序
变量
电话管理员:JTelephonyManager;
PSL:JCustomponestateListener;
开始
TelephonyManager:=TJTelephonyManager.Wrap(obj);
PSL:=tjcustomponestatelistener.JavaClass.init(PhoneStateListener);
如果开始的话
TelephonyManager.listen(PSL,
TJPhoneStateListener.JavaClass.LISTEN(信号强度)
//或TJPhoneStateListener.JavaClass.LISTEN\u信号强度
//或TJPhoneStateListener.JavaClass.LISTEN\u数据\u活动
其他的
TelephonyManager.listen(PSL,
TJPhoneStateListener.JavaClass.LISTEN(无)
结束
);
结束;
结束;
{TPhoneStateListener}
构造函数TPhoneStateListener.Create(AParent:TForm1);
开始
继承创造;
FParent:=公寓;
结束;
过程TPhoneStateListener.onCallForwardingIndicator已更改(cfi:布尔值);
开始
结束;
过程TPhoneStateListener.onCallStateChanged(状态:整数;
收入编号:JString);
开始
结束;
程序TPhoneStateListener.onCellInfoChanged(cellInfo:JList);
开始
结束;
程序TPhoneStateListener.oncellLocation更改(位置:JCellLocation);
开始
结束;
过程TPhoneStateListener.onDataActivity(方向:整数);
开始
结束;
过程TPhoneStateListener.onDataConnectionStateChanged(状态:整数);
开始
结束;
程序TPhoneStateListener.onDataConnectionStateChanged(状态,
网络类型:整数);
开始
结束;
过程TPhoneStateListener.onMessageWaitingIndicator更改(mwi:布尔值);
开始
结束;
程序TPhoneStateListener.onServiceStateChanged(
serviceState:JServiceState);
开始
结束;
程序TPhoneStateListener.onSignalsStrengthChanged(asu:整数);
开始
结束;
程序TPhoneStateListener.on信号强度已更改(
信号强度:J信号强度);
开始
F信号强度变化(信号强度) 这里有太多要解释的。我希望这能帮助您解决编码问题
type
TPhoneStateListener = class;
TfrmAppMain = class(TForm)
HeaderToolBar: TToolBar;
ToolBarLabel: TLabel;
TabControl1: TTabControl;
将光标放在TForm1.on信号强度更改(信号强度:JSignalStrength)上;输入源代码并按Ctrl-Shift-C。非常感谢。它可以工作。不客气。注意:根据您使用的是哪个Delphi版本,以及此代码是在主机中还是在服务中,可能不需要CallinUIThread()
。如果未使用它,则可以将TelephonyManager
和PSL
移动到frmAppMain
范围。
unit main;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, FMX.ExtCtrls, FMX.Helpers.Android, RTL.Controls,
Androidapi.JNI.Os, Androidapi.Helpers, Androidapi.JNI.Telephony,
Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes,
Androidapi.JNIBridge, Androidapi.JNI.App;
type
TPhoneStateListener = class;
TForm1 = class(TForm)
Button1: TButton;
RTLFixer1: TRTLFixer;
Memo1: TMemo;
Timer1: TTimer;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Timer1Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure InitPSListener(Start: Boolean);
private
PhoneStateListener: TPhoneStateListener;
FSignal: Integer;
{ Private declarations }
public
{ Public declarations }
end;
//type
TPhoneStateListener = class(TJavaLocal, JICustomPhoneStateListener)
private
[weak]
FParent : TForm1;
public
constructor Create(AParent : TForm1);
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;
var
Form1: TForm1;
implementation
{$R *.fmx}
{$R *.NmXhdpiPh.fmx ANDROID}
{$R *.LgXhdpiPh.fmx ANDROID}
procedure TForm1.Button1Click(Sender: TObject);
begin
InitPSListener(True);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
InitPSListener(False);
end;
procedure TForm1.InitPSListener(Start: Boolean);
var
obj: JObject;
begin
if PhoneStateListener = nil then
PhoneStateListener := TPhoneStateListener.Create(Self);
obj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
if obj <> nil then
begin
CallinUIThread(procedure
var
TelephonyManager: JTelephonyManager;
PSL: JCustomPhoneStateListener;
begin
TelephonyManager := TJTelephonyManager.Wrap(obj);
PSL := TJCustomPhoneStateListener.JavaClass.init(PhoneStateListener);
if Start then
TelephonyManager.listen(PSL,
TJPhoneStateListener.JavaClass.LISTEN_SIGNAL_STRENGTHS)
// or TJPhoneStateListener.JavaClass.LISTEN_SIGNAL_STRENGTH
// or TJPhoneStateListener.JavaClass.LISTEN_DATA_ACTIVITY
else
TelephonyManager.listen(PSL,
TJPhoneStateListener.JavaClass.LISTEN_NONE)
end
);
end;
end;
{ TPhoneStateListener }
constructor TPhoneStateListener.Create(AParent: TForm1);
begin
inherited Create;
FParent := AParent;
end;
procedure TPhoneStateListener.onCallForwardingIndicatorChanged(cfi: Boolean);
begin
end;
procedure TPhoneStateListener.onCallStateChanged(state: Integer;
incomingNumber: JString);
begin
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,
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
FParent.onSignalStrengthsChanged(signalStrength); <---- error is here
end;
procedure TForm1.OnSignalStrengthsChanged(signalStrength: JSignalStrength);
begin
FSignal := signalStrength.getLevel; // 0 - 4 <----- and is here
end;
end.
type
TPhoneStateListener = class;
TfrmAppMain = class(TForm)
HeaderToolBar: TToolBar;
ToolBarLabel: TLabel;
TabControl1: TTabControl;
private
PhoneStateListener: TPhoneStateListener;
FSignal: Integer;
TPhoneStateListener = class(TJavaLocal, JICustomPhoneStateListener)
private
[weak]
FParent : TfrmAppMain;
public
constructor Create(AParent : TfrmAppMain);
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 TfrmAppMain.FormShow(Sender: TObject);
begin
InitPSListener(True);
end;
procedure TfrmAppMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
InitPSListener(False);
end;
procedure TfrmAppMain.InitPSListener(Start: Boolean);
var
obj: JObject;
begin
if PhoneStateListener = nil then
PhoneStateListener := TPhoneStateListener.Create(Self);
obj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
if obj <> nil then
begin
CallinUIThread(procedure
var
TelephonyManager: JTelephonyManager;
PSL: JCustomPhoneStateListener;
begin
TelephonyManager := TJTelephonyManager.Wrap(obj);
PSL := TJCustomPhoneStateListener.JavaClass.init(PhoneStateListener);
if Start then
TelephonyManager.listen(PSL,
TJPhoneStateListener.JavaClass.LISTEN_SIGNAL_STRENGTHS)
// or TJPhoneStateListener.JavaClass.LISTEN_SIGNAL_STRENGTH
// or TJPhoneStateListener.JavaClass.LISTEN_DATA_ACTIVITY
else
TelephonyManager.listen(PSL,
TJPhoneStateListener.JavaClass.LISTEN_NONE)
end
);
end;
end;
{ TPhoneStateListener }
constructor TPhoneStateListener.Create(AParent: TfrmAppMain);
begin
inherited Create;
FParent := AParent;
end;
procedure TPhoneStateListener.onCallForwardingIndicatorChanged(cfi: Boolean);
begin
end;
procedure TPhoneStateListener.onCallStateChanged(state: Integer;
incomingNumber: JString);
begin
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,
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
FParent.onSignalStrengthsChanged(signalStrength);
end;
procedure TfrmAppMain.OnSignalStrengthsChanged(signalStrength: JSignalStrength);
begin
FSignal := signalStrength.getLevel; // 0 - 4
end;