我想在PhoneStateListener.onSignalStrengthChanged上获得LTE信号强度,但我不知道该怎么做。 非常感谢您的帮助。
procedure TPhoneStateListener.onSignalStrengthsChanged(signalStrength:JSignalStrength);
begin
//how can get LTE signal strength
end;
谢谢。
答案 0 :(得分:2)
PhoneStateListener将SignalStrength的实例传递给onSignalStrengthsChanged方法。但是,SignalStrength不包含LTE信号强度属性。
您可以通过阅读TelephonyManager。getAllCellInfo()使用此代码来访问LTE信号强度:
private void printLteSignalStrengths() {
List<CellInfo> cellInfoList = telephonyManager.getAllCellInfo();
for (CellInfo cellInfo : cellInfoList) {
if (cellInfo instanceof CellInfoLte) {
// cast to CellInfoLte and call all the CellInfoLte methods you need
CellInfoLte ci = (CellInfoLte) cellInfo;
System.out.println("LTE signal strength: " + ci.getCellSignalStrength().getDbm());
}
}
}
对于Delphi,将花括号替换为begin / end和end,并使用通常的包装器类。
请注意,该代码需要ACCESS_COARSE_LOCATION权限。
答案 1 :(得分:1)
您将注意到,您无法在Phonestatelistener的onSignalstrengthschanged
中获得Cellinfo的信号强度等。那里不可用!相反,您可以根据需要多次请求它。您可以在单独的线程上使用计时器或定时循环来实现此目的。我的手机上装有LTE时,在android.telephony.CellInfoLte
列表中没有任何Cells
对象,因此我选择获取android.telephony.CellInfoWcdma
。显示了两者的代码。
procedure TfrmAppMain.GetCellLevel: Integer;
var
obj: JObject;
Cells: JList;
i: Integer;
Cell: JCellInfo;
CellInfoLte: JCellInfoLte;
CellInfoWcdma: JCellInfoWcdma;
cname: String;
begin
Result := -1;
obj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
if obj <> nil then
begin
TelephonyManager := TJTelephonyManager.Wrap(obj);
Cells := TelephonyManager.getAllCellInfo;
// iter := Cells.iterator;
i := 0;
while (i < cells.size) do
begin
obj := Cells.get(i);
Cell := TJCellInfo.Wrap(obj);
if Cell.isRegistered then
begin
cname := JStringToString(Cell.getClass.getName);
if cname = 'android.telephony.CellInfoLte' then
begin
CellInfoLte := TJCellInfoLte.Wrap(Cell);
Result := CellInfoLte.getCellSignalStrength.getLevel; // 0..4
end
else if cname = 'android.telephony.CellInfoWcdma' then
begin
CellInfoWcdma := TJCellInfoWcdma.Wrap(Cell);
Result := CellInfoWcdma.getCellSignalStrength.getLevel; // 0..4
end;
end;
Inc(i);
end;
end;
end;