如何在onsignal上获得LTE信号强度

时间:2019-03-15 12:42:46

标签: android delphi lte signal-strength

我想在PhoneStateListener.onSignalStrengthChanged上获得LTE信号强度,但我不知道该怎么做。 非常感谢您的帮助。

procedure TPhoneStateListener.onSignalStrengthsChanged(signalStrength:JSignalStrength);
begin 
          //how can get LTE signal strength 
end;  

谢谢。

2 个答案:

答案 0 :(得分:2)

PhoneStateListenerSignalStrength的实例传递给onSignalStrengthsChanged方法。但是,SignalStrength不包含LTE信号强度属性。

您可以通过阅读TelephonyManagergetAllCellInfo()使用此代码来访问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;