Android 【信号格的客制化】Part 二:客制化修改代码说明与示例

Android 【信号格的客制化】Part 2:客制化修改代码说明与示例

前言
         欢迎大家我分享和推荐好用的代码段~~
声明
         欢迎转载,但请保留文章原始出处:
         CSDN:
http://www.csdn.net
         雨季o莫忧离:http://blog.csdn.net/luckkof

正文

 

 

上面介绍的是信号格的计算公式,下面将针对不同的版本做客制化方式说明。

 

GB/GB2

由于6573/6575 Android V2.3中modem的source code没有给到客户,且相关的信号物理参数也没有上报给AP端,因此信号格的客制化只能根据客户自己需求推导出asu值之后,在SatusBarPolicy.java中修改相关代码实现客制化。

 

GB3

这个版本上,信号的物理参数会通过AT+ECSQ上报给AP端,格式为:

AT< +ECSQ: <asu>, <ber>, <rssi>    (2G网络)

AT< +ECSQ: <asu>, <ber>, <rssi>, <rscp>, <ec/no>     (3G网络)

在StatusBarPolicy.java中的updateSignalStrength()(单卡版本接口)或者updateSignalStrength(int simId)(双卡版本接口)中,通过mSignalStrength.getGsmSignalStrengthDbm()来获取到信号的rssi(2G)或者rscp(3G)的值,然后进行客制化即可。

 

Example:WCDAM/GSM网络asu作为匹配参数:

 Android 【信号格的客制化】Part 二:客制化修改代码说明与示例

 

ICS/ICS2

1、 信号的物理参数会通过AT+ECSQ上报给AP端,格式为:

AT< +ECSQ: <asu>, <ber>, <rssi>    (2G网络)

AT< +ECSQ: <asu>, <ber>, <rssi>, <rscp>, <ec/no>     (3G网络)

其中<rssi>, <rscp>, <ec/no>这几个物理参数上报时单位为qdbm,换算为dbm的公式为:dbm=qdbm/4

 

2、AP端信号格处理是在SignalStrength.java中。asu与icon level的对应关系使用的是getGsmLevel()。

一般的客制化需求可能会有以下几种修改的情况:

a.区分3G网络与2G网络

可以通过判断 mGsmRscpQdbm < 0 是否是3G网络,若是3G网络的话,这个判断为true,反之则是2G网络。

b.使用asu与icon level来匹配

可以自行通过计算自己需求上的信号物理参数,来得到对应的asu值来自行修改信号格数的显示。

c.使用dbm与icon level来匹配

若是asu的方式没有办法实现贵司的需求的话,可以直接使用RSCP或者RSSI这种信号物理参数来与信号格数匹配。

2G:RSSI在代码中可以通过getGsmDbm()得到

3G:RSCP在代码中可以直接使用mGsmRscpQdbm来得到

 

JB/JB2/JB3/JB5

1 信号的物理参数会通过AT+ECSQ上报给AP端,格式为:

AT< +ECSQ: <asu>, <ber>, <rssi>    (2G网络)

AT< +ECSQ: <asu>, <ber>, <rssi>, <rscp>, <ec/no>     3G网络)

其中<rssi>, <rscp>, <ec/no>这几个物理参数上报时单位为qdbm,换算为dbm的公式为:dbm=qdbm/4

 

2SignalStrength.java中使用IServiceStateExt作为不同运营商客制化的接口。

Ø  对于普通版本:IServiceStateExt的实现为ServiceStateExt.java

Ø  对于中国移动(OP01)版本:IServiceStateExt的实现为ServiceStateExtOP01.java

步骤1:请修改ServiceStateExtXXX.java中的mapGsmSignalDbm(int GsmRscpQdbm,int asu)接口为以下形式,以方便我们接下来的客制化

    public int mapGsmSignalDbm(int GsmRscpQdbm,int asu){

        int dBm;

 

 //mtk add

        if(mGsmRscpQdbm < 0 && mGsmRscpQdbm ! = -1)

            dBm = GsmRscpQdbm / 4; // Return raw value for 3G network.

        else

//mtk add end

            dBm = -113 + (2 * asu);       

             

        return dBm;

    }

 

    步骤2:SignalStrength.java中修改getGsmLevel()

    public int getGsmLevel() {

        int level;

 

        // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5

        // asu = 0 (-113dB or less) is very weak

        // signal, its better to show 0 bars to the user in such cases.

        // asu = 99 is a special case, where the signal strength is unknown.

        int asu = getGsmSignalStrength();

        int dBm = getGsmDbm();   //mtk add

        boolean is3G = (mGsmRscpQdbm < 0 && mGsmRscpQdbm ! = -1) ? true : false;    //mtk add

 

        try{
//mtk add

            //level = mServiceStateExt.mapGsmSignalLevel(asu);

            level = mServiceStateExt.mapGsmSignalLevel(is3G, dBm, asu);

//mtk add end

        } catch (Exception e){

            if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;

            else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT;

            else if (asu >= 8)  level = SIGNAL_STRENGTH_GOOD;

            else if (asu >= 5)  level = SIGNAL_STRENGTH_MODERATE;

            else level = SIGNAL_STRENGTH_POOR;

        }

       

        if (DBG) log("getGsmLevel=" + level);

        return level;

    }

 

步骤3:ServiceStateExtXXX.java中添加mapGsmSignalLevel (boolean is3G, int dBm,int asu),做信号格mapping

a.区分3G网络与2G网络

可以通过判断函数参数is3G是否是3G网络,若是3G网络的话为true,反之则是2G网络。

b.使用asuicon level来匹配

利用传入的asu参数,根据自己信号格标准修改代码

c.使用dbmicon level来匹配

利用传入的dBm参数,根据自己信号格标准修改代码。

 

    Example:使用asu作为参数计算WCDMA/GSM信号

    Android 【信号格的客制化】Part 二:客制化修改代码说明与示例