前言
欢迎大家我分享和推荐好用的代码段~~
声明
欢迎转载,但请保留文章原始出处:
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作为匹配参数:
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
2、SignalStrength.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.使用asu与icon level来匹配
利用传入的asu参数,根据自己信号格标准修改代码。
c.使用dbm与icon level来匹配
利用传入的dBm参数,根据自己信号格标准修改代码。
Example:使用asu作为参数计算WCDMA/GSM信号