当前位置: 首页 > 知识库问答 >
问题:

从电话管理器解析getAllcellinfo值

濮阳品
2023-03-14

我正在使用以下函数来获取设备网络的Allcell info,并将其作为字符串获取值,现在我需要解析它,以便获得CellSignal加强Lte数据我如何实现它

//代码

 TelephonyManager tm = (TelephonyManager) Context.getSystemService(mContext.TELEPHONY_SERVICE);
 List<CellInfo> cellInfos = tm.getAllCellInfo();
 String data = cellInfos.get(0).toString();
 Log.d("Info ", " "+data);

结果是

CellInfoLte:{mRegistered=YES mTimeStampType=oem_ril mTimeStamp=207387894126206ns CellIdentityLte:{ mMcc=405 mMnc=869 mCi=2971664 mPci=123 mTac=56} CellSignalStrengthLte: ss=25 rsrp=-91 rsrq=-7 rssnr=2147483647 cqi=2147483647 ta=2147483647}

如何解析此字符串以获得有关CellinfoLte, CellIdtyLte的详细信息

共有1个答案

艾浩广
2023-03-14

我还注意到CellinfoLTE和CellIdentityLTE目前还不太好,所以我只编写了自己的解析类。只测试了几次,没有问题,但是如果将来需要额外的调整,应该会显示更多的测试。

下面是课程:

public class LTEStruct
{
public static final int UNKNOWN = Integer.MAX_VALUE;   //Default value for unknown fields

public boolean isRegistered;
public long timeStamp;
public int MCC;
public int MNC;
public int CID;
public int PCI;
public int TAC;

public int SS;
public int RSRP;
public int RSRQ;
public int RSSNR;
public int CQI;
public int tAdvance;

Context mContext;

//Public constructor
public LTEStruct(Context context)
{
    mContext = context; //not used at the moment but possibly for future function
}

public void parse(String inTest)
{
    //get isRegistered
    int index = inTest.indexOf("mRegistered=") + ("mRegistered=").length();
    if(inTest.substring(index,index + 3).contains("YES"))
        isRegistered = true;
    else
        isRegistered = false;

    //getTimestamp
    timeStamp = getValue(inTest,"mTimeStamp=", "ns");

    //get Cell Identity paramters
    MCC = (int) getValue(inTest,"mMcc=", " ");      //get Mcc
    MNC = (int) getValue(inTest,"mMnc=", " ");      //get MNC
    CID = (int) getValue(inTest,"mCi=", " ");       //get CID
    PCI = (int) getValue(inTest,"mPci="," ");       //get PCI
    TAC = (int) getValue(inTest,"mTac=","}");       //get TAC

    //get RF related parameters
    SS = (int) getValue(inTest," ss="," ");         //get SS
    RSRP = (int)getValue(inTest,"rsrp=", " ");      //get RSRP
    RSRQ = (int)getValue(inTest,"rsrq=", " ");      //get RSRQ
    RSSNR = (int)getValue(inTest,"rssnr=", " ");    //get RSSNR
    CQI = (int)getValue(inTest," cqi=", " ");       //get CQI
    tAdvance = (int)getValue(inTest," ta=", "}");   //get timing advance
}

//internal function to help with parsing of raw LTE strings
private long getValue(String fullS, String startS, String stopS)
{
    int index = fullS.indexOf(startS) + (startS).length();
    int endIndex = fullS.indexOf(stopS,index);

    return Long.parseLong(fullS.substring(index,endIndex).trim());
}

}

因此,如果我基本上用输入LTE字符串实现这一点:

    //permission check
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
        ActivityCompat.requestPermissions((Activity)this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},1);

    //get cell info
    TelephonyManager tel = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
    List<CellInfo> infos = tel.getAllCellInfo();
    for (int i = 0; i<infos.size(); ++i) 
    {
        try 
        {
            CellInfo info = infos.get(i);
            if (info instanceof CellInfoLte) {
                LTEStruct lte = new LTEStruct(this);
                lte.parse(info.toString());

                //write out parsed results for what it's worth
                Log.i("LTE parseOutput", "tAdvance: " + lte.tAdvance + "\r\nCQI: " + lte.CQI + "\r\nRSSNR: " + lte.RSSNR + "\r\nRSRP: " + lte.RSRP + "\r\nSS: " + lte.SS +
                        "\r\nCID: " + lte.CID + "\r\nTimestamp: " + lte.timeStamp + "\r\nTAC: " + lte.TAC + "\r\nPCI: " + lte.PCI + "\r\nMNC: " + lte.MNC + "\r\nMCC: " + lte.MCC + "\r\nRegistered: " + lte.isRegistered);
            } else
                Log.i("LTE testing", "not LTE cell info measured");

        } catch (Exception ex) {
            Log.i("neighboring error: ", ex.getMessage());
        }

    }

希望有帮助;)

 类似资料:
  • 主要内容:本节引言:,1.获得TelephonyManager的服务对象,2.用法示例,3.本节示例代码下载,本节小结:本节引言: 本章节是Android基础入门教程的最后一章,主要讲解是一些零零散散的一些知识点,以及一些遗漏 知识点的补充,这些零散的知识点包括,各种系统服务的使用,比如本节的电话管理器,短信管理器, 振动器,闹钟,壁纸等等,还有传感器之类的东西!乱七八糟什么都有哈!好的,本节我们要学习的 是TelephonyManager,见名知义:用于管理手机通话状态,获取电话信息(设备信息

  • 我试图确定multisim Android设备(运行Android 7.0)是否有任何工作/启用的sim卡。为此,我遵循Google关于将多个TelephonyManager附加到默认TelephonyManager实例的文档,如下所示:https://developer.android.com/reference/android/telephony/TelephonyManager.html#S

  • imi 中内置了一个注解管理器,通过它可以轻松获取到类、方法、属性、常量中的注解。 类:\Imi\Bean\Annotation\AnnotationManager 用法 获取注解使用点 AnnotationManager::getAnnotationPoints($annotationClassName, $where = null): array 参数名称 说明 annotationClass

  • 成功开发 Web 应用程序的难题之一是在一次用户访问,即会话期间,当用户在一个应用程序的页与页之间跳转的同时,维护用户信息。HTTP 是一种无状态协议,也就是说,Web 服务器将某页的每次访问都当作相互无关的访问来处理;服务器不保留前一次访问的任何信息,即使访问就发生在当前访问的几秒钟之前。正因为这种不记忆以前访问的特性使得编写联机目录之类的应用程序很困难,此类应用程序可能需要跟踪用户在目录的不同

  • 说到Seata中的配置管理,大家可能会想到Seata中适配的各种配置中心,其实今天要说的不是这个,虽然也会简单分析Seata和各配置中心的适配过程,但主要还是讲解Seata配置管理的核心实现 Server启动流程 在讲配置中心之前,先简单介绍一下Server端的启动流程,因为这一块就涉及到配置管理的初始化,核心流程如下: 程序入口在Server#main方法中 获取port的几种形式:从容器中获取

  • 嵌入式系统低功耗管理的目的在于满足用户对性能需求的前提下,尽可能降低系统能耗以延长设备待机时间。高性能与有限的电池能量在嵌入式系统中矛盾最为突出,硬件低功耗设计与软件低功耗管理的联合应用成为解决矛盾的有效手段。现在的各种 MCU 都或多或少的在低功耗方面提供了管理接口。比如对主控时钟频率的调整、工作电压的改变、总线频率的调整甚至关闭、外围设备工作时钟的关闭等。有了硬件上的支持,合理的软件设计就成为