我手机开数据时,4g信号满格却不能上网格是满的,上不了网,而且4g信号满格却不能上网格旁边并没有显示E和G网,这是咋回事

当前位置:
> 帖子正文
中兴N880E手机显示有WIFI信号,但是连不上网
如题,即使在电信的营业厅里有满格信号,用电信的天翼WIFI端输入账号和密码也上不了网,搜索结果说是没有信号。
不吐不快,我来说两句...
最新评论(2)
发表于: 12:30:08
手机以前能上,就是从昨天开始不能上了。系统已经重新安装,升级到了4.1,已经ROOT
发表于: 15:25:11
手机连上wifi,只是你跟路由器之间建立了联系,并不代表你就能上网,这是两码事。你可以看看你的无线的高级设置里,你的IP是自动获取还是手动填写的,如果是自动的话,那么你的路由器是否开启了DHCP功能
发表于: 15:31:30
我的能3G上网,但是用WIFI时,用电信的那个WIFI端上网,显示搜索不到信号,即使在信号满格的电信营业厅
您需要注册登录后,才能回帖哦!
上市时间:2018.03
上市时间:2017.11
上市时间:2018.02
上市时间:2017.09
上市时间:2018.03
上市时间:2018.02
上市时间:2017.11
上市时间:2018.03
上市时间:2017.12
上市时间:2018.03
您已经签到了,请明天再来吧!我手机信号是满格,上面也有E或者H的小图标,数据连接也打开了的,但是就是上不了网,QQ都上不了。_百度知道
我手机信号是满格,上面也有E或者H的小图标,数据连接也打开了的,但是就是上不了网,QQ都上不了。
我有更好的答案
移动的打10086人工问下联通打10010有时候没开通上网服务。。或者不支持用流量。开通下就好了。。
您好,建议您拨打400-818-8818联想移动客服热线进行咨询。
和你当地得网络有关,关闭数据连接再重新打开试试,或者重启手机
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。联想乐檬K3信号格那里有时E有时G,是怎么回事,我并没有开数据连接,会不会耗用流量?_百度知道
联想乐檬K3信号格那里有时E有时G,是怎么回事,我并没有开数据连接,会不会耗用流量?
我有更好的答案
您好。手机信号栏显示E或G都是2G网络的标识,若未开启数据连接,正常是不会出现这两个字母的,正常显示应该是4G、3G或者不显示字母。若开启数据连接的话,显示一般是4G、H、E等。建议您关闭数据连接,进入乐安全-流量监控设置流量使用。对手机进行观察使用,若有异常可重启手机、更换sim卡,甚至备份资料恢复出厂设置尝试。有异常还可以联系联想手机售后检测。官方授权维修站点查询:欢迎您随时与我们联系或访问联想乐问吧()进行咨询了解。
采纳率:97%
为您推荐:
其他类似问题
数据连接的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Android系统移植与调试之-------&如何修改Android手机显示的4G信号强度的格子数
在修改显示的信号强度之前,先了解一下什么是dB,什么是dBm?
  dB是一个表征相对值的值,纯粹的比值,只表示两个量的相对大小关系,没有单位,当考虑甲的功率相比于乙功率大或小多少个dB时,
按下面的计算公式:10log(甲功率/乙功率),如果采用两者的电压比计算,要用20log(甲电压/乙电压)。)
  [例] 甲功率比乙功率大一倍,那么10lg(甲功率/乙功率)=10lg2=3dB。也就是说,甲的功率比乙的功率大3 dB。
  反之,如果甲的功率是乙的功率的一半,则甲的功率比乙的功率小3 dB。
  dBm是一个表示功率绝对值的值(也可以认为是以1mW功率为基准的一个比值),计算公式为:10log(功率值/1mw)。
  [例] 如果功率P为1mw,折算为dBm后为0dBm。
  [例] 对于40W的功率,按dBm单位进行折算后的值应为:
    10log(40W/1mw)=10log(40000)=10log4+10log10000=46dBm。
  总之,dB是两个量之间的比值,表示两个量间的相对大小,而dBm则是表示功率绝对大小的值。在dB,dBm计算中,要注意基本概念,
用一个dBm减另外一个dBm时,得到的结果是dB,如:30dBm - 0dBm = 30dB。
3.手机信号强度表示
  好了,那么手机上显示的数字的单位是那个呢,是dBm。当你仔细看的时候会发现这个值是负的,也就是说手机会显示比如 -67(dBm),那就说明信号很强了.
这里还说一个小知识:
  中国移动的规范规定,手机接收电平&=(城市取-90dB乡村取 -94dBm )时,则满足覆盖要求,也就是说此处无线信号强度满足覆盖要求。
  -67dBm 要比-90dBm 信号要强20多个dB ,那么它在打电话接通成功率和通话过程中的话音质量都会好的多(当然也包括EDGE/GPRS上网的速度那些 )
  所以,那个值越大信号就越好,因为那是个负值,而且在你手里的时候它永远是负值 ,如果你感
兴趣且附近有无线基站的天线的话,你也可以把你的手机尽量接近天线面板,那么值就越来越大,如果手机跟天线面板挨到一起,
那么它可能十分接近于0了(0是达不到的,这里的0的意思也不是说手机没信号了。)
  在信号强度计选择工程模式,显示了很多参数,你只要看BCCHLev(控制信道电平值)它就是手机的信号强度值,单位dBm,多大的信号你的手机可以正常接听呢,BCCHLev-C1,C1也有显示数值,如:BCCHLev(-63) ,C1(34),表示你的手机在信号大于-97dBm的状况下是不会掉话的。
  再来看手机发射功率要多大才合适呢,按GSM协议规定,手机发射功率是可以被基站控制的。基站通过下行SACCH信道,发出命令控制手机的发射功率级别,
每个功率级别差2dB;
  GSM900 手机最大发射功率级别是5(2W=2000mw,33dBm),最小发射功率级别是19(3mw,5dBm),
  DCS1800手机最大发射功率级别是0(1W,30dBm),最小发射功率级别是15(1mW,0dBm)。
  当手机远离基站,或者处于无线阴影区时,基站可以命令手机发出较大功率,直至33dBm(GSM900),
以克服远距离传输或建筑物遮挡所造成的信号损耗。
  强度计里的TXPower就是手机发射功率,你在拨打电话的状态下可以看出你的手机发射功率,也就是数值越大越省电,辐射越小,数值在5,
你的电话耗电大电池用不了一天,通话时别人经常听不到你的声音,你的手机经常会突然没信号,会掉话,这样你可以打投诉电话让运营商来做信号覆盖,
让你的手机信号好起来,减少辐射。
  以上那么多字,只有一个核心意思。不要被你手机信号还有多少格欺骗!!!那都是手机厂商自己定义的。咱要玩专业点的,直接看信号强度dBm。
android系统查信号强度在设置—关于手机—网络里。
  室内和室外的信号强度是有差距的。一般室外信号比室内好。
现在来看这个所谓的dBm,数值范围在-XX~0之间。这个数越大,信号强度越高。
-50dBm~0dBm范围内,恭喜你,你的信号已经好得很了。话说你就站在基站旁边是吧,哈
-90dBm~-60dBm,同样恭喜你,你基本不会面临打不了电话的问题。如果打不了的,找运营商吧,那是他们的问题。
G室内,DS放桌上信号强度-67dBm,23asu。作打电话状握手里,-75dBm,19asu。调整各种姿势,看到的最低是-83dBm,15asu。
这属于什么等级呢?简单说就是,信号很不错。室外没看,但肯定比这个高,
至于其他手机,可以自己上网去看,和DS的dBm值大多在一个档次。个别帖子炫耀自己大于-50dBm的,都是因为他就在基站边上。正常的范围是-90dBm~-60dBm。
====================================================================================
下面我们来看看手机没有修改时候的显示效果,关于手机--&状态信息--&SIM卡状态--&信号强度,就能看到手机的信号强度了。如下图所示:
1、当信号大于等于-85dBm时候,信号显示满格
2、当信号大于等于-95dBm时候,而小于-85dBm时,信号显示3格
3、当信号大于等于-105dBm时候,而小于-95dBm时,信号显示2格,不好捕捉到。
4、当信号大于等于-115dBm时候,而小于-105dBm时,信号显示1格,不好捕捉到。
5、当信号大于等于-140dBm时候,而小于-115dBm时,信号显示0格,不好捕捉到。
上面几个等级的相应划分的源代码在:rameworks/base/telephony/java/android/telephony/SignalStrength.java
中的getLteLevel()方法中,代码1如下:
* Get LTE as level 0..4
public int getLteLevel() {
* TS 36.214 Physical Layer Section 5.1.3 TS 36.331 RRC RSSI = received
* signal + noise RSRP = reference signal dBm RSRQ = quality of signal
* dB= Number of Resource blocksxRSRP/RSSI SNR = gain=signal/noise ratio
* = -10log P1/P2 dB
int rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
int rsrpIconLevel = -1;
int snrIconLevel = -1;
int rsrpThreshType = Resources.getSystem().getInteger(com.android.internal.R.integer.
config_LTE_RSRP_threshold_type);
int[] threshR
if (rsrpThreshType == RSRP_THRESH_TYPE_STRICT) {
threshRsrp = RSRP_THRESH_STRICT;
threshRsrp = RSRP_THRESH_LENIENT;
//[ALPS][ALPS]-START: change level mapping rule of signal for CMCC
if (!IS_BSP_PACKAGE) {
IServiceStateExt ssExt = getPlugInInstance();
if (ssExt != null) {
rsrpIconLevel = ssExt.mapLteSignalLevel(mLteRsrp, mLteRssnr, mLteSignalStrength);
//added by ouyang
android.util.Log.e("oyp", "ssExt != null, rsrpIconLevel:"+ rsrpIconLevel);
return rsrpIconL
log("[getLteLevel] null plug-in instance");
//modifed by ouyang [] start
if (mLteRsrp & -44) {
rsrpIconLevel = -1;
} else if (mLteRsrp &= -85) {
rsrpIconLevel = SIGNAL_STRENGTH_GREAT;
} else if (mLteRsrp &= -95) {
rsrpIconLevel = SIGNAL_STRENGTH_GOOD;
} else if (mLteRsrp &= -105) {
rsrpIconLevel = SIGNAL_STRENGTH_MODERATE;
} else if (mLteRsrp &= -115) {
rsrpIconLevel = SIGNAL_STRENGTH_POOR;
} else if (mLteRsrp &= -140) {
rsrpIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
if (mLteRsrp & -44) {
rsrpIconLevel = -1;
} else if (mLteRsrp &= -97) {
rsrpIconLevel = SIGNAL_STRENGTH_GREAT;
} else if (mLteRsrp &= -105) {
rsrpIconLevel = SIGNAL_STRENGTH_GOOD;
} else if (mLteRsrp &= -110) {
rsrpIconLevel = SIGNAL_STRENGTH_MODERATE;
} else if (mLteRsrp &= -120) {
rsrpIconLevel = SIGNAL_STRENGTH_POOR;
} else if (mLteRsrp &= -140) {
rsrpIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
//modifed by ouyang [] end
//added by ouyang
android.util.Log.e("oyp", "getLTELevel - rsrp:" + mLteRsrp + " rsrpIconLevel:"
+ rsrpIconLevel);
* Values are -200 dB to +300 (SNR*10dB) RS_SNR &= 13.0 dB =&4 bars 4.5
* dB &= RS_SNR & 13.0 dB =& 3 bars 1.0 dB &= RS_SNR & 4.5 dB =& 2 bars
* -3.0 dB &= RS_SNR & 1.0 dB 1 bar RS_SNR & -3.0 dB/No Service Antenna
* Icon Only
if (mLteRssnr & 300) {
snrIconLevel = -1;
} else if (mLteRssnr &= 130) {
snrIconLevel = SIGNAL_STRENGTH_GREAT;
} else if (mLteRssnr &= 45) {
snrIconLevel = SIGNAL_STRENGTH_GOOD;
} else if (mLteRssnr &= 10) {
snrIconLevel = SIGNAL_STRENGTH_MODERATE;
} else if (mLteRssnr &= -30) {
snrIconLevel = SIGNAL_STRENGTH_POOR;
} else if (mLteRssnr &= -200) {
snrIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
//added by ouyang
android.util.Log.e("oyp", "getLTELevel - snr:" + mLteRssnr + " snrIconLevel:" + snrIconLevel);
if (DBG) log("getLTELevel - rsrp:" + mLteRsrp + " snr:" + mLteRssnr + " rsrpIconLevel:"
+ rsrpIconLevel + " snrIconLevel:" + snrIconLevel);
/* Choose a measurement type to use for notification */
if (snrIconLevel != -1 && rsrpIconLevel != -1) {
* The number of bars displayed shall be the smaller of the bars
* associated with LTE RSRP and the bars associated with the LTE
//added by ouyang
android.util.Log.e("oyp", "snrIconLevel != -1 && rsrpIconLevel != -1,"
+"return rsrpIconLevel & snrIconLevel ? rsrpIconLevel : snrIconLevel"
+(rsrpIconLevel & snrIconLevel));
return (rsrpIconLevel & snrIconLevel ? rsrpIconLevel : snrIconLevel);
if (snrIconLevel != -1) {
//added by ouyang
android.util.Log.e("oyp", "snrIconLevel != -1");
return snrIconL
if (rsrpIconLevel != -1) {
//added by ouyang
android.util.Log.e("oyp", "rsrpIconLevel != -1");
return rsrpIconL
/* Valid values are (0-63, 99) as defined in TS 36.331 */
if (mLteSignalStrength & 63) {
rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
} else if (mLteSignalStrength &= 12) {
rssiIconLevel = SIGNAL_STRENGTH_GREAT;
} else if (mLteSignalStrength &= 8) {
rssiIconLevel = SIGNAL_STRENGTH_GOOD;
} else if (mLteSignalStrength &= 5) {
rssiIconLevel = SIGNAL_STRENGTH_MODERATE;
} else if (mLteSignalStrength &= 0) {
rssiIconLevel = SIGNAL_STRENGTH_POOR;
//added by ouyang
android.util.Log.e("oyp", "getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"
+ rssiIconLevel);
if (DBG) {
log("getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"
+ rssiIconLevel);
return rssiIconL
//[ALPS][ALPS]-END: change level mapping rule of signal for CMCC
可以看到未修改前,划分的几个等级是:
1.大于-85时候,等级为SIGNAL_STRENGTH_GREAT,即为4
2.大于-95时候,等级为SIGNAL_STRENGTH_GOOD,即为3
3.大于-105时候,等级为SIGNAL_STRENGTH_MODERATE,即为2
4.大于-115时候,等级为SIGNAL_STRENGTH_POOR,即为1
5.大于-140时候,等级为SIGNAL_STRENGTH_NONE_OR_UNKNOWN,即为0
6.大于-44时候,等级为-1
修改后,将上面的几个等级划分改为:
1.大于-97时候,等级为SIGNAL_STRENGTH_GREAT,即为4
2.大于-105时候,等级为SIGNAL_STRENGTH_GOOD,即为3
3.大于-110时候,等级为SIGNAL_STRENGTH_MODERATE,即为2
4.大于-120时候,等级为SIGNAL_STRENGTH_POOR,即为1
5.大于-140时候,等级为SIGNAL_STRENGTH_NONE_OR_UNKNOWN,即为0
6.大于-44时候,等级为-1
由于上面的,加入了MTK的修复patch,代码2如下:
//[ALPS][ALPS]-START: change level mapping rule of signal for CMCC
if (!IS_BSP_PACKAGE) {
IServiceStateExt ssExt = getPlugInInstance();
if (ssExt != null) {
rsrpIconLevel = ssExt.mapLteSignalLevel(mLteRsrp, mLteRssnr, mLteSignalStrength);
//added by ouyang
android.util.Log.e("oyp", "ssExt != null, rsrpIconLevel:"+ rsrpIconLevel);
return rsrpIconL
log("[getLteLevel] null plug-in instance");
上面代码的意思是,先把这等级划分的值从加入的插件中去获取,如果获取不到再执行我上面修改的,所以要去修改
IServiceStateExt的mapLteSignalLevel(mLteRsrp, mLteRssnr, mLteSignalStrength)方法。当然如果没有这个插件的话,可以直接把我上面的这段代码2从代码1中注释即可。
由于IServiceStateExt是个接口,所以去修改它的具体实现类。通过查找源代码,找到了实现类DefaultServiceStateExt。
该类目录位于:vendor/mediatek/proprietary/frameworks/base/packages/FwkPlugin/src/com/mediatek/op/telephony/DefaultServiceStateExt.java
修改后代码如下:
//[ALPS][ALPS]-START: change level mapping rule of signal for CMCC
public int mapLteSignalLevel(int mLteRsrp, int mLteRssnr, int mLteSignalStrength) {
//added by ouyang
android.util.Log.e("mapLteSignalLevel", "mapLteSignalLevel starting .......");
* TS 36.214 Physical Layer Section 5.1.3 TS 36.331 RRC RSSI = received
* signal + noise RSRP = reference signal dBm RSRQ = quality of signal
* dB= Number of Resource blocksxRSRP/RSSI SNR = gain=signal/noise ratio
* = -10log P1/P2 dB
int rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
int rsrpIconLevel = -1;
int snrIconLevel = -1;
//modifed by ouyang [] start
if (mLteRsrp & -44) {
rsrpIconLevel = -1;
} else if (mLteRsrp &= -85) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_GREAT;
} else if (mLteRsrp &= -95) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_GOOD;
} else if (mLteRsrp &= -105) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_MODERATE;
} else if (mLteRsrp &= -115) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_POOR;
} else if (mLteRsrp &= -140) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
if (mLteRsrp & -44) {
rsrpIconLevel = -1;
} else if (mLteRsrp &= -97) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_GREAT;
} else if (mLteRsrp &= -105) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_GOOD;
} else if (mLteRsrp &= -110) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_MODERATE;
} else if (mLteRsrp &= -120) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_POOR;
} else if (mLteRsrp &= -140) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
//added by ouyang
android.util.Log.e("mapLteSignalLevel", "getLTELevel - rsrp:" + mLteRsrp + " rsrpIconLevel:"+ rsrpIconLevel);
//modifed by ouyang [] end
* Values are -200 dB to +300 (SNR*10dB) RS_SNR &= 13.0 dB =&4 bars 4.5
* dB &= RS_SNR & 13.0 dB =& 3 bars 1.0 dB &= RS_SNR & 4.5 dB =& 2 bars
* -3.0 dB &= RS_SNR & 1.0 dB 1 bar RS_SNR & -3.0 dB/No Service Antenna
* Icon Only
if (mLteRssnr & 300) {
snrIconLevel = -1;
} else if (mLteRssnr &= 130) {
snrIconLevel = SignalStrength.SIGNAL_STRENGTH_GREAT;
} else if (mLteRssnr &= 45) {
snrIconLevel = SignalStrength.SIGNAL_STRENGTH_GOOD;
} else if (mLteRssnr &= 10) {
snrIconLevel = SignalStrength.SIGNAL_STRENGTH_MODERATE;
} else if (mLteRssnr &= -30) {
snrIconLevel = SignalStrength.SIGNAL_STRENGTH_POOR;
} else if (mLteRssnr &= -200) {
snrIconLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
//added by ouyang
android.util.Log.e("mapLteSignalLevel", "getLTELevel - snr:" + mLteRssnr + " snrIconLevel:" + snrIconLevel);
Log.i(TAG, "getLTELevel - rsrp:" + mLteRsrp + " snr:" + mLteRssnr + " rsrpIconLevel:"
+ rsrpIconLevel + " snrIconLevel:" + snrIconLevel);
/* Choose a measurement type to use for notification */
if (snrIconLevel != -1 && rsrpIconLevel != -1) {
* The number of bars displayed shall be the smaller of the bars
* associated with LTE RSRP and the bars associated with the LTE
//added by ouyang
android.util.Log.e("mapLteSignalLevel", "snrIconLevel != -1 && rsrpIconLevel != -1,"
+"return rsrpIconLevel & snrIconLevel ? rsrpIconLevel : snrIconLevel"
+(rsrpIconLevel & snrIconLevel));
return (rsrpIconLevel & snrIconLevel ? rsrpIconLevel : snrIconLevel);
if (snrIconLevel != -1) {
//added by ouyang
android.util.Log.e("mapLteSignalLevel", "snrIconLevel != -1");
return snrIconL
if (rsrpIconLevel != -1) {
//added by ouyang
android.util.Log.e("mapLteSignalLevel", "rsrpIconLevel != -1");
return rsrpIconL
/* Valid values are (0-63, 99) as defined in TS 36.331 */
if (mLteSignalStrength & 63) {
rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
} else if (mLteSignalStrength &= 12) {
rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_GREAT;
} else if (mLteSignalStrength &= 8) {
rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_GOOD;
} else if (mLteSignalStrength &= 5) {
rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_MODERATE;
} else if (mLteSignalStrength &= 0) {
rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_POOR;
//added by ouyang
android.util.Log.e("mapLteSignalLevel", "getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"
+ rssiIconLevel);
Log.i(TAG, "getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"
+ rssiIconLevel);
return rssiIconL
//[ALPS][ALPS]-END: change level mapping rule of signal for CMCC
修改完代码后,make systemimage后烧录到MTK平台手机即可。
====================================================================================
修改后的效果图如下所示:
1、当信号大于等于-97dBm时候,信号显示满格,而修改之前需要大于-85dBm。
2、当信号大于等于-105dBm时候,而小于-97dBm时,信号显示少一个,而修改之前需要大于-95dBm。
3、当信号大于等于-110dBm时候,而小于-105dBm时,信号显示2格,不好捕捉到。
4、当信号大于等于-120dBm时候,而小于-110dBm时,信号显示1格,不好捕捉到。
5、当信号大于等于-140dBm时候,而小于-120dBm时,信号显示0格,不好捕捉到。
====================================================================================
当然,要修改电信、移动、联通的3G、2G信号也可以在这个类中去修改。
最后附上源代码
\frameworks\base\telephony\java\android\telephony\SignalStrength.java
* Copyright (C) 2014 MediaTek Inc.
* Modification based on code covered by the mentioned copyright
* and/or permission notice(s).
* Copyright (C) 2012 The Android Open Source Project
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
package android.
import android.os.B
import android.os.P
import android.os.P
import android.telephony.R
import android.content.res.R
import android.os.SystemP
import com.mediatek.common.MP
import com.mediatek.common.telephony.IServiceStateE
* Contains phone signal strength related information.
public class SignalStrength implements Parcelable {
private static final String LOG_TAG = "SignalStrength";
private static final boolean DBG =
/** @hide */
public static final int SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0;
/** @hide */
public static final int SIGNAL_STRENGTH_POOR = 1;
/** @hide */
public static final int SIGNAL_STRENGTH_MODERATE = 2;
/** @hide */
public static final int SIGNAL_STRENGTH_GOOD = 3;
/** @hide */
public static final int SIGNAL_STRENGTH_GREAT = 4;
/** @hide */
public static final int NUM_SIGNAL_STRENGTH_BINS = 5;
/** @hide */
public static final String[] SIGNAL_STRENGTH_NAMES = {
"none", "poor", "moderate", "good", "great"
/** @hide */
//Use int max, as -1 is a valid value in signal strength
public static final int INVALID = 0x7FFFFFFF;
private static final int RSRP_THRESH_TYPE_STRICT = 0;
//modified by ouyang
//private static final int[] RSRP_THRESH_STRICT = new int[] {-140, -115, -105, -95, -85, -44};
private static final int[] RSRP_THRESH_STRICT = new int[] {-140, -120, -110, -105, -97, -44};
private static final int[] RSRP_THRESH_LENIENT = new int[] {-140, -128, -118, -108, -98, -44};
private int mGsmSignalS // Valid values are (0-31, 99) as defined in TS 27.007 8.5
private int mGsmBitErrorR
// bit error rate (0-7, 99) as defined in TS 27.007 8.5
private int mCdmaD
// This value is the RSSI value
private int mCdmaE
// This value is the Ec/Io
private int mEvdoD
// This value is the EVDO RSSI value
private int mEvdoE
// This value is the EVDO Ec/Io
private int mEvdoS
// Valid values are 0-8.
8 is the highest signal to noise ratio
private int mLteSignalS
private int mLteR
private int mLteR
private int mLteR
private int mLteC
//MTK-START
private int mGsmRssiQ // This valus is GSM 3G rssi value
private int mGsmRscpQ // This valus is GSM 3G rscp value
private int mGsmEcn0Q // This valus is GSM 3G ecn0 value
private static IServiceStateExt mServiceStateExt =
private static final boolean IS_BSP_PACKAGE = (SystemProperties.getInt("ro.mtk_bsp_package", 0) == 1);
private boolean isG // This value is set by the ServiceStateTracker onSignalStrengthResult
* Create a new SignalStrength from a intent notifier Bundle
* This method is used by PhoneStateIntentReceiver and maybe by
* external applications.
* @param m Bundle from intent notifier
* @return newly created SignalStrength
public static SignalStrength newFromBundle(Bundle m) {
ret = new SignalStrength();
ret.setFromNotifierBundle(m);
* Empty constructor
public SignalStrength() {
mGsmSignalStrength = 99;
mGsmBitErrorRate = -1;
mCdmaDbm = -1;
mCdmaEcio = -1;
mEvdoDbm = -1;
mEvdoEcio = -1;
mEvdoSnr = -1;
mLteSignalStrength = 99;
mLteRsrp = INVALID;
mLteRsrq = INVALID;
mLteRssnr = INVALID;
mLteCqi = INVALID;
* This constructor is used to create SignalStrength with default
* values and set the isGsmFlag with the value passed in the input
* @param gsmFlag true if Gsm Phone,false if Cdma phone
* @return newly created SignalStrength
public SignalStrength(boolean gsmFlag) {
mGsmSignalStrength = 99;
mGsmBitErrorRate = -1;
mCdmaDbm = -1;
mCdmaEcio = -1;
mEvdoDbm = -1;
mEvdoEcio = -1;
mEvdoSnr = -1;
mLteSignalStrength = 99;
mLteRsrp = INVALID;
mLteRsrq = INVALID;
mLteRssnr = INVALID;
mLteCqi = INVALID;
isGsm = gsmF
* Constructor
public SignalStrength(int gsmSignalStrength, int gsmBitErrorRate,
int cdmaDbm, int cdmaEcio,
int evdoDbm, int evdoEcio, int evdoSnr,
int lteSignalStrength, int lteRsrp, int lteRsrq, int lteRssnr, int lteCqi,
boolean gsmFlag) {
initialize(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio,
evdoDbm, evdoEcio, evdoSnr, lteSignalStrength, lteRsrp,
lteRsrq, lteRssnr, lteCqi, gsmFlag);
//MTK-START
* Constructor
public SignalStrength(int gsmSignalStrength, int gsmBitErrorRate,
int cdmaDbm, int cdmaEcio,
int evdoDbm, int evdoEcio, int evdoSnr,
int lteSignalStrength, int lteRsrp, int lteRsrq, int lteRssnr, int lteCqi,
boolean gsmFlag, int gsmRssiQdbm, int gsmRscpQdbm, int gsmEcn0Qdbm) {
initialize(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio,
evdoDbm, evdoEcio, evdoSnr, lteSignalStrength, lteRsrp,
lteRsrq, lteRssnr, lteCqi, gsmFlag);
mGsmRssiQdbm = gsmRssiQ
mGsmRscpQdbm = gsmRscpQ
mGsmEcn0Qdbm = gsmEcn0Q
* Constructor
public SignalStrength(int gsmSignalStrength, int gsmBitErrorRate,
int cdmaDbm, int cdmaEcio,
int evdoDbm, int evdoEcio, int evdoSnr,
boolean gsmFlag) {
initialize(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio,
evdoDbm, evdoEcio, evdoSnr, 99, INVALID,
INVALID, INVALID, INVALID, gsmFlag);
* Copy constructors
* @param s Source SignalStrength
public SignalStrength(SignalStrength s) {
copyFrom(s);
* Initialize gsm/cdma values, sets lte values to defaults.
* @param gsmSignalStrength
* @param gsmBitErrorRate
* @param cdmaDbm
* @param cdmaEcio
* @param evdoDbm
* @param evdoEcio
* @param evdoSnr
* @param gsm
public void initialize(int gsmSignalStrength, int gsmBitErrorRate,
int cdmaDbm, int cdmaEcio,
int evdoDbm, int evdoEcio, int evdoSnr,
boolean gsm) {
initialize(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio,
evdoDbm, evdoEcio, evdoSnr, 99, INVALID,
INVALID, INVALID, INVALID, gsm);
* Initialize all the values
* @param gsmSignalStrength
* @param gsmBitErrorRate
* @param cdmaDbm
* @param cdmaEcio
* @param evdoDbm
* @param evdoEcio
* @param evdoSnr
* @param lteSignalStrength
* @param lteRsrp
* @param lteRsrq
* @param lteRssnr
* @param lteCqi
* @param gsm
public void initialize(int gsmSignalStrength, int gsmBitErrorRate,
int cdmaDbm, int cdmaEcio,
int evdoDbm, int evdoEcio, int evdoSnr,
int lteSignalStrength, int lteRsrp, int lteRsrq, int lteRssnr, int lteCqi,
boolean gsm) {
mGsmSignalStrength = gsmSignalS
mGsmBitErrorRate = gsmBitErrorR
mCdmaDbm = cdmaD
mCdmaEcio = cdmaE
mEvdoDbm = evdoD
mEvdoEcio = evdoE
mEvdoSnr = evdoS
mLteSignalStrength = lteSignalS
mLteRsrp = lteR
mLteRsrq = lteR
mLteRssnr = lteR
mLteCqi = lteC
if (DBG) {
log("initialize: " + toString());
private static IServiceStateExt getPlugInInstance() {
log("SignalStrength get plugin");
if (!IS_BSP_PACKAGE) {
if (mServiceStateExt == null) {
mServiceStateExt = MPlugin.createInstance(IServiceStateExt.class.getName());
} catch (RuntimeException e) {
log("Get plugin fail");
mServiceStateExt =
e.printStackTrace();
log("BSP package should not use plug in");
return mServiceStateE
protected void copyFrom(SignalStrength s) {
mGsmSignalStrength = s.mGsmSignalS
mGsmBitErrorRate = s.mGsmBitErrorR
mCdmaDbm = s.mCdmaD
mCdmaEcio = s.mCdmaE
mEvdoDbm = s.mEvdoD
mEvdoEcio = s.mEvdoE
mEvdoSnr = s.mEvdoS
mLteSignalStrength = s.mLteSignalS
mLteRsrp = s.mLteR
mLteRsrq = s.mLteR
mLteRssnr = s.mLteR
mLteCqi = s.mLteC
isGsm = s.isG
mGsmRssiQdbm = s.mGsmRssiQ
mGsmRscpQdbm = s.mGsmRscpQ
mGsmEcn0Qdbm = s.mGsmEcn0Q
* Construct a SignalStrength object from the given parcel.
public SignalStrength(Parcel in) {
if (DBG) {
log("Size of signalstrength parcel:" + in.dataSize());
mGsmSignalStrength = in.readInt();
mGsmBitErrorRate = in.readInt();
mCdmaDbm = in.readInt();
mCdmaEcio = in.readInt();
mEvdoDbm = in.readInt();
mEvdoEcio = in.readInt();
mEvdoSnr = in.readInt();
mLteSignalStrength = in.readInt();
mLteRsrp = in.readInt();
mLteRsrq = in.readInt();
mLteRssnr = in.readInt();
mLteCqi = in.readInt();
isGsm = (in.readInt() != 0);
//MTK-START [ALPS]
mGsmRssiQdbm = in.readInt();
mGsmRscpQdbm = in.readInt();
mGsmEcn0Qdbm = in.readInt();
//MTK-END [ALPS]
* Make a SignalStrength object from the given parcel as passed up by
* the ril which does not have isGsm. isGsm will be changed by ServiceStateTracker
* so the default is a don't care.
public static SignalStrength makeSignalStrengthFromRilParcel(Parcel in) {
if (DBG) {
log("Size of signalstrength parcel:" + in.dataSize());
SignalStrength ss = new SignalStrength();
ss.mGsmSignalStrength = in.readInt();
ss.mGsmBitErrorRate = in.readInt();
ss.mCdmaDbm = in.readInt();
ss.mCdmaEcio = in.readInt();
ss.mEvdoDbm = in.readInt();
ss.mEvdoEcio = in.readInt();
ss.mEvdoSnr = in.readInt();
ss.mLteSignalStrength = in.readInt();
ss.mLteRsrp = in.readInt();
ss.mLteRsrq = in.readInt();
ss.mLteRssnr = in.readInt();
ss.mLteCqi = in.readInt();
ss.isGsm = (in.readInt() != 0);
//MTK-START [ALPS]
ss.mGsmRssiQdbm = in.readInt();
ss.mGsmRscpQdbm = in.readInt();
ss.mGsmEcn0Qdbm = in.readInt();
//MTK-END [ALPS]
* {@link Parcelable#writeToParcel}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mGsmSignalStrength);
out.writeInt(mGsmBitErrorRate);
out.writeInt(mCdmaDbm);
out.writeInt(mCdmaEcio);
out.writeInt(mEvdoDbm);
out.writeInt(mEvdoEcio);
out.writeInt(mEvdoSnr);
out.writeInt(mLteSignalStrength);
out.writeInt(mLteRsrp);
out.writeInt(mLteRsrq);
out.writeInt(mLteRssnr);
out.writeInt(mLteCqi);
out.writeInt(isGsm ? 1 : 0);
//MTK-START [ALPS]
out.writeInt(mGsmRssiQdbm);
out.writeInt(mGsmRscpQdbm);
out.writeInt(mGsmEcn0Qdbm);
//MTK-END [ALPS]
* {@link Parcelable#describeContents}
public int describeContents() {
* {@link Parcelable.Creator}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public SignalStrength createFromParcel(Parcel in) {
return new SignalStrength(in);
public SignalStrength[] newArray(int size) {
return new SignalStrength[size];
* Validate the individual signal strength fields as per the range
* specified in ril.h
* Set to invalid any field that is not in the valid range
* Cdma, evdo, lte rsrp & rsrq values are sign converted
* when received from ril interface
Valid values for all signalstrength fields
public void validateInput() {
if (DBG) {
log("Signal before validate=" + this);
// TS 27.007 8.5
mGsmSignalStrength = mGsmSignalStrength &= 0 ? mGsmSignalStrength : 99;
mCdmaDbm = mCdmaDbm & 0 ? -mCdmaDbm : -120;
mCdmaEcio = (mCdmaEcio & 0) ? -mCdmaEcio : -160;
mEvdoDbm = (mEvdoDbm & 0) ? -mEvdoDbm : -120;
mEvdoEcio = (mEvdoEcio &= 0) ? -mEvdoEcio : -1;
mEvdoSnr = ((mEvdoSnr & 0) && (mEvdoSnr &= 8)) ? mEvdoSnr : -1;
// TS 36.214 Physical Layer Section 5.1.3, TS 36.331 RRC
mLteSignalStrength = (mLteSignalStrength &= 0) ? mLteSignalStrength : 99;
mLteRsrp = ((mLteRsrp &= 44) && (mLteRsrp &= 140)) ? -mLteRsrp : SignalStrength.INVALID;
mLteRsrq = ((mLteRsrq &= 3) && (mLteRsrq &= 20)) ? -mLteRsrq : SignalStrength.INVALID;
mLteRssnr = ((mLteRssnr &= -200) && (mLteRssnr &= 300)) ? mLteRssnr
: SignalStrength.INVALID;
// Cqi no change
if (DBG) {
log("Signal after validate=" + this);
* @param true - Gsm, Lte phones
false - Cdma phones
* Used by voice phone to set the isGsm
public void setGsm(boolean gsmFlag) {
isGsm = gsmF
* Get the GSM Signal Strength, valid values are (0-31, 99) as defined in TS
* 27.007 8.5
public int getGsmSignalStrength() {
return this.mGsmSignalS
* Get the GSM bit error rate (0-7, 99) as defined in TS 27.007 8.5
public int getGsmBitErrorRate() {
return this.mGsmBitErrorR
* Get the CDMA RSSI value in dBm
public int getCdmaDbm() {
return this.mCdmaD
* Get the CDMA Ec/Io value in dB*10
public int getCdmaEcio() {
return this.mCdmaE
* Get the EVDO RSSI value in dBm
public int getEvdoDbm() {
return this.mEvdoD
* Get the EVDO Ec/Io value in dB*10
public int getEvdoEcio() {
return this.mEvdoE
* Get the signal to noise ratio. Valid values are 0-8. 8 is the highest.
public int getEvdoSnr() {
return this.mEvdoS
/** @hide */
public int getLteSignalStrength() {
return mLteSignalS
/** @hide */
public int getLteRsrp() {
return mLteR
/** @hide */
public int getLteRsrq() {
return mLteR
/** @hide */
public int getLteRssnr() {
return mLteR
/** @hide */
public int getLteCqi() {
return mLteC
* Get signal level as an int from 0..4
public int getLevel() {
if (isGsm) {
level = getLteLevel();
//MTE-START [ALPS]
//if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
if (!isCampOnLte()) {
//MTE-END [ALPS]
level = getGsmLevel();
int cdmaLevel = getCdmaLevel();
int evdoLevel = getEvdoLevel();
if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
/* We don't know evdo, use cdma */
level = cdmaL
} else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
/* We don't know cdma, use evdo */
level = evdoL
/* We know both, use the lowest level */
level = cdmaLevel & evdoLevel ? cdmaLevel : evdoL
if (DBG) {
log("getLevel=" + level);
* Get the signal level as an asu value between 0..31, 99 is unknown
public int getAsuLevel() {
if (isGsm) {
//MTE-START [ALPS]
//if (getLteLevel() == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
if (!isCampOnLte()) {
//MTE-END [ALPS]
asuLevel = getGsmAsuLevel();
asuLevel = getLteAsuLevel();
int cdmaAsuLevel = getCdmaAsuLevel();
int evdoAsuLevel = getEvdoAsuLevel();
if (evdoAsuLevel == 0) {
/* We don't know evdo use, cdma */
asuLevel = cdmaAsuL
} else if (cdmaAsuLevel == 0) {
/* We don't know cdma use, evdo */
asuLevel = evdoAsuL
/* We know both, use the lowest level */
asuLevel = cdmaAsuLevel & evdoAsuLevel ? cdmaAsuLevel : evdoAsuL
if (DBG) {
log("getAsuLevel=" + asuLevel);
return asuL
* Get the signal strength as dBm
public int getDbm() {
if(isGsm()) {
dBm = getLteDbm();
//MTE-START [ALPS]
//if (dBm == INVALID) {
if (!isCampOnLte()) {
//MTE-END [ALPS]
dBm = getGsmDbm();
int cdmaDbm = getCdmaDbm();
int evdoDbm = getEvdoDbm();
return (evdoDbm == -120 || evdoDbm == -113) ? cdmaDbm
: ((cdmaDbm == -120 || cdmaDbm == -113) ? evdoDbm
: (cdmaDbm & evdoDbm ? cdmaDbm : evdoDbm));
if (DBG) {
log("getDbm=" + dBm);
return dBm;
* Get Gsm signal strength as dBm
public int getGsmDbm() {
int gsmSignalStrength = getGsmSignalStrength();
int asu = (gsmSignalStrength == 99 ? -1 : gsmSignalStrength);
if (asu != -1) {
if (!IS_BSP_PACKAGE) {
IServiceStateExt ssExt = getPlugInInstance();
if (ssExt != null) {
dBm = ssExt.mapGsmSignalDbm(mGsmRscpQdbm, asu);
log("[getGsmDbm] null plug-in instance");
log("mapGsmSignalDbm() mGsmRscpQdbm=" + mGsmRscpQdbm + " asu=" + asu);
if (mGsmRscpQdbm & 0) {
dBm = mGsmRscpQdbm / 4; //Return raw value for 3G Network
dBm = -113 + (2 * asu);
if (DBG) {
log("getGsmDbm=" + dBm);
return dBm;
* Get gsm as level 0..4
public int getGsmLevel() {
// 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();
if (!IS_BSP_PACKAGE) {
IServiceStateExt ssExt = getPlugInInstance();
if (ssExt != null) {
level = ssExt.mapGsmSignalLevel(asu, mGsmRscpQdbm);
log("[getGsmLevel] null plug-in instance");
// [ALPS] -- START , for 3G network
if (mGsmRscpQdbm & 0) {
// 3G network
if (asu &= 5 || asu == 99) {
level = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
} else if (asu &= 15) {
level = SignalStrength.SIGNAL_STRENGTH_GREAT;
} else if (asu &= 12) {
level = SignalStrength.SIGNAL_STRENGTH_GOOD;
} else if (asu &= 9) {
level = SignalStrength.SIGNAL_STRENGTH_MODERATE;
level = SignalStrength.SIGNAL_STRENGTH_POOR;
// [ALPS] -- END
// 2G network
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;
level = SIGNAL_STRENGTH_POOR;
if (DBG) {
log("getGsmLevel=" + level);
* Get the gsm signal level as an asu value between 0..31, 99 is unknown
public int getGsmAsuLevel() {
// 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 level = getGsmSignalStrength();
if (DBG) {
log("getGsmAsuLevel=" + level);
* Get cdma as level 0..4
public int getCdmaLevel() {
final int cdmaDbm = getCdmaDbm();
final int cdmaEcio = getCdmaEcio();
int levelD
int levelE
if (cdmaDbm &= -75) levelDbm = SIGNAL_STRENGTH_GREAT;
else if (cdmaDbm &= -85) levelDbm = SIGNAL_STRENGTH_GOOD;
else if (cdmaDbm &= -95) levelDbm = SIGNAL_STRENGTH_MODERATE;
else if (cdmaDbm &= -100) levelDbm = SIGNAL_STRENGTH_POOR;
else levelDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
// Ec/Io are in dB*10
if (cdmaEcio &= -90) levelEcio = SIGNAL_STRENGTH_GREAT;
else if (cdmaEcio &= -110) levelEcio = SIGNAL_STRENGTH_GOOD;
else if (cdmaEcio &= -130) levelEcio = SIGNAL_STRENGTH_MODERATE;
else if (cdmaEcio &= -150) levelEcio = SIGNAL_STRENGTH_POOR;
else levelEcio = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
int level = (levelDbm & levelEcio) ? levelDbm : levelE
/// M: [C2K] Only use dbm as to calculate level. @{
if (isC2KSupport()) {
level = levelD
/// M: [C2K] Only use dbm as to calculate level. @}
if (DBG) {
log("getCdmaLevel=" + level);
* Get the cdma signal level as an asu value between 0..31, 99 is unknown
public int getCdmaAsuLevel() {
final int cdmaDbm = getCdmaDbm();
final int cdmaEcio = getCdmaEcio();
int cdmaAsuL
int ecioAsuL
if (cdmaDbm &= -75) cdmaAsuLevel = 16;
else if (cdmaDbm &= -82) cdmaAsuLevel = 8;
else if (cdmaDbm &= -90) cdmaAsuLevel = 4;
else if (cdmaDbm &= -95) cdmaAsuLevel = 2;
else if (cdmaDbm &= -100) cdmaAsuLevel = 1;
else cdmaAsuLevel = 99;
// Ec/Io are in dB*10
if (cdmaEcio &= -90) ecioAsuLevel = 16;
else if (cdmaEcio &= -100) ecioAsuLevel = 8;
else if (cdmaEcio &= -115) ecioAsuLevel = 4;
else if (cdmaEcio &= -130) ecioAsuLevel = 2;
else if (cdmaEcio &= -150) ecioAsuLevel = 1;
else ecioAsuLevel = 99;
int level = (cdmaAsuLevel & ecioAsuLevel) ? cdmaAsuLevel : ecioAsuL
if (DBG) {
log("getCdmaAsuLevel=" + level);
* Get Evdo as level 0..4
public int getEvdoLevel() {
int evdoDbm = getEvdoDbm();
int evdoSnr = getEvdoSnr();
int levelEvdoD
int levelEvdoS
if (evdoDbm &= -65) levelEvdoDbm = SIGNAL_STRENGTH_GREAT;
else if (evdoDbm &= -75) levelEvdoDbm = SIGNAL_STRENGTH_GOOD;
else if (evdoDbm &= -90) levelEvdoDbm = SIGNAL_STRENGTH_MODERATE;
else if (evdoDbm &= -105) levelEvdoDbm = SIGNAL_STRENGTH_POOR;
else levelEvdoDbm = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
if (evdoSnr &= 7) levelEvdoSnr = SIGNAL_STRENGTH_GREAT;
else if (evdoSnr &= 5) levelEvdoSnr = SIGNAL_STRENGTH_GOOD;
else if (evdoSnr &= 3) levelEvdoSnr = SIGNAL_STRENGTH_MODERATE;
else if (evdoSnr &= 1) levelEvdoSnr = SIGNAL_STRENGTH_POOR;
else levelEvdoSnr = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
int level = (levelEvdoDbm & levelEvdoSnr) ? levelEvdoDbm : levelEvdoS
if (DBG) {
log("getEvdoLevel=" + level);
* Get the evdo signal level as an asu value between 0..31, 99 is unknown
public int getEvdoAsuLevel() {
int evdoDbm = getEvdoDbm();
int evdoSnr = getEvdoSnr();
int levelEvdoD
int levelEvdoS
if (evdoDbm &= -65) levelEvdoDbm = 16;
else if (evdoDbm &= -75) levelEvdoDbm = 8;
else if (evdoDbm &= -85) levelEvdoDbm = 4;
else if (evdoDbm &= -95) levelEvdoDbm = 2;
else if (evdoDbm &= -105) levelEvdoDbm = 1;
else levelEvdoDbm = 99;
if (evdoSnr &= 7) levelEvdoSnr = 16;
else if (evdoSnr &= 6) levelEvdoSnr = 8;
else if (evdoSnr &= 5) levelEvdoSnr = 4;
else if (evdoSnr &= 3) levelEvdoSnr = 2;
else if (evdoSnr &= 1) levelEvdoSnr = 1;
else levelEvdoSnr = 99;
int level = (levelEvdoDbm & levelEvdoSnr) ? levelEvdoDbm : levelEvdoS
if (DBG) {
log("getEvdoAsuLevel=" + level);
* Get LTE as dBm
public int getLteDbm() {
return mLteR
* Get LTE as level 0..4
public int getLteLevel() {
* TS 36.214 Physical Layer Section 5.1.3 TS 36.331 RRC RSSI = received
* signal + noise RSRP = reference signal dBm RSRQ = quality of signal
* dB= Number of Resource blocksxRSRP/RSSI SNR = gain=signal/noise ratio
* = -10log P1/P2 dB
int rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
int rsrpIconLevel = -1;
int snrIconLevel = -1;
int rsrpThreshType = Resources.getSystem().getInteger(com.android.internal.R.integer.
config_LTE_RSRP_threshold_type);
int[] threshR
if (rsrpThreshType == RSRP_THRESH_TYPE_STRICT) {
threshRsrp = RSRP_THRESH_STRICT;
threshRsrp = RSRP_THRESH_LENIENT;
//[ALPS][ALPS]-START: change level mapping rule of signal for CMCC
if (!IS_BSP_PACKAGE) {
IServiceStateExt ssExt = getPlugInInstance();
if (ssExt != null) {
rsrpIconLevel = ssExt.mapLteSignalLevel(mLteRsrp, mLteRssnr, mLteSignalStrength);
//added by ouyang
android.util.Log.e("oyp", "ssExt != null, rsrpIconLevel:"+ rsrpIconLevel);
return rsrpIconL
log("[getLteLevel] null plug-in instance");
//modifed by ouyang [] start
if (mLteRsrp & -44) {
rsrpIconLevel = -1;
} else if (mLteRsrp &= -85) {
rsrpIconLevel = SIGNAL_STRENGTH_GREAT;
} else if (mLteRsrp &= -95) {
rsrpIconLevel = SIGNAL_STRENGTH_GOOD;
} else if (mLteRsrp &= -105) {
rsrpIconLevel = SIGNAL_STRENGTH_MODERATE;
} else if (mLteRsrp &= -115) {
rsrpIconLevel = SIGNAL_STRENGTH_POOR;
} else if (mLteRsrp &= -140) {
rsrpIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
if (mLteRsrp & -44) {
rsrpIconLevel = -1;
} else if (mLteRsrp &= -97) {
rsrpIconLevel = SIGNAL_STRENGTH_GREAT;
} else if (mLteRsrp &= -105) {
rsrpIconLevel = SIGNAL_STRENGTH_GOOD;
} else if (mLteRsrp &= -110) {
rsrpIconLevel = SIGNAL_STRENGTH_MODERATE;
} else if (mLteRsrp &= -120) {
rsrpIconLevel = SIGNAL_STRENGTH_POOR;
} else if (mLteRsrp &= -140) {
rsrpIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
//modifed by ouyang [] end
//added by ouyang
android.util.Log.e("oyp", "getLTELevel - rsrp:" + mLteRsrp + " rsrpIconLevel:"
+ rsrpIconLevel);
* Values are -200 dB to +300 (SNR*10dB) RS_SNR &= 13.0 dB =&4 bars 4.5
* dB &= RS_SNR & 13.0 dB =& 3 bars 1.0 dB &= RS_SNR & 4.5 dB =& 2 bars
* -3.0 dB &= RS_SNR & 1.0 dB 1 bar RS_SNR & -3.0 dB/No Service Antenna
* Icon Only
if (mLteRssnr & 300) {
snrIconLevel = -1;
} else if (mLteRssnr &= 130) {
snrIconLevel = SIGNAL_STRENGTH_GREAT;
} else if (mLteRssnr &= 45) {
snrIconLevel = SIGNAL_STRENGTH_GOOD;
} else if (mLteRssnr &= 10) {
snrIconLevel = SIGNAL_STRENGTH_MODERATE;
} else if (mLteRssnr &= -30) {
snrIconLevel = SIGNAL_STRENGTH_POOR;
} else if (mLteRssnr &= -200) {
snrIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
//added by ouyang
android.util.Log.e("oyp", "getLTELevel - snr:" + mLteRssnr + " snrIconLevel:" + snrIconLevel);
if (DBG) log("getLTELevel - rsrp:" + mLteRsrp + " snr:" + mLteRssnr + " rsrpIconLevel:"
+ rsrpIconLevel + " snrIconLevel:" + snrIconLevel);
/* Choose a measurement type to use for notification */
if (snrIconLevel != -1 && rsrpIconLevel != -1) {
* The number of bars displayed shall be the smaller of the bars
* associated with LTE RSRP and the bars associated with the LTE
//added by ouyang
android.util.Log.e("oyp", "snrIconLevel != -1 && rsrpIconLevel != -1,"
+"return rsrpIconLevel & snrIconLevel ? rsrpIconLevel : snrIconLevel"
+(rsrpIconLevel & snrIconLevel));
return (rsrpIconLevel & snrIconLevel ? rsrpIconLevel : snrIconLevel);
if (snrIconLevel != -1) {
//added by ouyang
android.util.Log.e("oyp", "snrIconLevel != -1");
return snrIconL
if (rsrpIconLevel != -1) {
//added by ouyang
android.util.Log.e("oyp", "rsrpIconLevel != -1");
return rsrpIconL
/* Valid values are (0-63, 99) as defined in TS 36.331 */
if (mLteSignalStrength & 63) {
rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
} else if (mLteSignalStrength &= 12) {
rssiIconLevel = SIGNAL_STRENGTH_GREAT;
} else if (mLteSignalStrength &= 8) {
rssiIconLevel = SIGNAL_STRENGTH_GOOD;
} else if (mLteSignalStrength &= 5) {
rssiIconLevel = SIGNAL_STRENGTH_MODERATE;
} else if (mLteSignalStrength &= 0) {
rssiIconLevel = SIGNAL_STRENGTH_POOR;
//added by ouyang
android.util.Log.e("oyp", "getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"
+ rssiIconLevel);
if (DBG) {
log("getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"
+ rssiIconLevel);
return rssiIconL
//[ALPS][ALPS]-END: change level mapping rule of signal for CMCC
* Get the LTE signal level as an asu value between 0..97, 99 is unknown
* Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69
public int getLteAsuLevel() {
int lteAsuLevel = 99;
int lteDbm = getLteDbm();
* 3GPP 27.007 (Ver 10.3.0) Sec 8.69
-140 dBm or less
-138... -44 dBm
-43 dBm or greater
* 255 not known or not detectable
* validateInput will always give a valid range between -140 t0 -44 as
* per ril.h. so RSRP &= -43 & &-140 will fall under asu level 255
* and not 97 or 0
if (lteDbm == SignalStrength.INVALID) {
lteAsuLevel = 255;
lteAsuLevel = lteDbm + 140;
if (DBG) {
log("Lte Asu level: " + lteAsuLevel);
return lteAsuL
* @return true if this is for GSM
public boolean isGsm() {
return this.isG
* @return hash code
public int hashCode() {
int primeNum = 31;
return ((mGsmSignalStrength * primeNum)
+ (mGsmBitErrorRate * primeNum)
+ (mCdmaDbm * primeNum) + (mCdmaEcio * primeNum)
+ (mEvdoDbm * primeNum) + (mEvdoEcio * primeNum) + (mEvdoSnr * primeNum)
+ (mLteSignalStrength * primeNum) + (mLteRsrp * primeNum)
+ (mLteRsrq * primeNum) + (mLteRssnr * primeNum) + (mLteCqi * primeNum)
+ (isGsm ? 1 : 0));
* @return true if the signal strengths are the same
public boolean equals (Object o) {
s = (SignalStrength)
} catch (ClassCastException ex) {
if (o == null) {
return (mGsmSignalStrength == s.mGsmSignalStrength
&& mGsmBitErrorRate == s.mGsmBitErrorRate
&& mCdmaDbm == s.mCdmaDbm
&& mCdmaEcio == s.mCdmaEcio
&& mEvdoDbm == s.mEvdoDbm
&& mEvdoEcio == s.mEvdoEcio
&& mEvdoSnr == s.mEvdoSnr
&& mLteSignalStrength == s.mLteSignalStrength
&& mLteRsrp == s.mLteRsrp
&& mLteRsrq == s.mLteRsrq
&& mLteRssnr == s.mLteRssnr
&& mLteCqi == s.mLteCqi
&& isGsm == s.isGsm
&& mGsmRscpQdbm == s.mGsmRscpQdbm); /* ALPS */
* @return string representation.
public String toString() {
return ("SignalStrength:"
+ " " + mGsmSignalStrength
+ " " + mGsmBitErrorRate
+ " " + mCdmaDbm
+ " " + mCdmaEcio
+ " " + mEvdoDbm
+ " " + mEvdoEcio
+ " " + mEvdoSnr
+ " " + mLteSignalStrength
+ " " + mLteRsrp
+ " " + mLteRsrq
+ " " + mLteRssnr
+ " " + mLteCqi
+ " " + (isGsm ? "gsm|lte" : "cdma")
+ " " + mGsmRssiQdbm
+ " " + mGsmRscpQdbm
+ " " + mGsmEcn0Qdbm);
* Set SignalStrength based on intent notifier map
* @param m intent notifier map
private void setFromNotifierBundle(Bundle m) {
mGsmSignalStrength = m.getInt("GsmSignalStrength");
mGsmBitErrorRate = m.getInt("GsmBitErrorRate");
mCdmaDbm = m.getInt("CdmaDbm");
mCdmaEcio = m.getInt("CdmaEcio");
mEvdoDbm = m.getInt("EvdoDbm");
mEvdoEcio = m.getInt("EvdoEcio");
mEvdoSnr = m.getInt("EvdoSnr");
mLteSignalStrength = m.getInt("LteSignalStrength");
mLteRsrp = m.getInt("LteRsrp");
mLteRsrq = m.getInt("LteRsrq");
mLteRssnr = m.getInt("LteRssnr");
mLteCqi = m.getInt("LteCqi");
isGsm = m.getBoolean("isGsm");
mGsmRssiQdbm = m.getInt("RssiQdbm");
mGsmRscpQdbm = m.getInt("RscpQdbm");
mGsmEcn0Qdbm = m.getInt("Ecn0Qdbm");
* Set intent notifier Bundle based on SignalStrength
* @param m intent notifier Bundle
public void fillInNotifierBundle(Bundle m) {
m.putInt("GsmSignalStrength", mGsmSignalStrength);
m.putInt("GsmBitErrorRate", mGsmBitErrorRate);
m.putInt("CdmaDbm", mCdmaDbm);
m.putInt("CdmaEcio", mCdmaEcio);
m.putInt("EvdoDbm", mEvdoDbm);
m.putInt("EvdoEcio", mEvdoEcio);
m.putInt("EvdoSnr", mEvdoSnr);
m.putInt("LteSignalStrength", mLteSignalStrength);
m.putInt("LteRsrp", mLteRsrp);
m.putInt("LteRsrq", mLteRsrq);
m.putInt("LteRssnr", mLteRssnr);
m.putInt("LteCqi", mLteCqi);
m.putBoolean("isGsm", Boolean.valueOf(isGsm));
m.putInt("RssiQdbm", mGsmRssiQdbm);
m.putInt("RscpQdbm", mGsmRscpQdbm);
m.putInt("Ecn0Qdbm", mGsmEcn0Qdbm);
private static void log(String s) {
Rlog.w(LOG_TAG, s);
* Get the GSM 3G rssi value
public int getGsmRssiQdbm() {
return this.mGsmRssiQ
* Get the GSM 3G rscp value
public int getGsmRscpQdbm() {
return this.mGsmRscpQ
* Get the GSM 3G ecn0 value
public int getGsmEcn0Qdbm() {
return this.mGsmEcn0Q
* Get the GSM Signal Strength Dbm value
* @internal
public int getGsmSignalStrengthDbm() {
int dBm = -1;
int gsmSignalStrength = this.mGsmSignalS
int asu = (gsmSignalStrength == 99 ? -1 : gsmSignalStrength);
if (asu != -1) {
if (!IS_BSP_PACKAGE) {
IServiceStateExt ssExt = getPlugInInstance();
if (ssExt != null) {
dBm = ssExt.mapGsmSignalDbm(mGsmRscpQdbm, asu);
return dBm;
log("[getGsmSignalStrengthDbm] null plug-in instance");
dBm = -113 + (2 * asu);
return dBm;
* Test whether two objects hold the same data values or both are null
* @param a first obj
* @param b second obj
* @return true if two objects equal or both are null
private static boolean equalsHandlesNulls(Object a, Object b) {
return (a == null) ? (b == null) : a.equals(b);
//MTE-START [ALPS]
* check if current network is LTE
* if we camp on LTE network then the least fiele of +ECSQ will be .
* It will be set to mEvdoDbm in getSingnalStrength() of ril_nw.c
* And change value to "-7" by SingnalStrength.validateInput() when GsmSST receive signal update.
* @return true when camp on LTE network
* @internal
private boolean isCampOnLte() {
return (isGsm() && (mEvdoDbm == -7)) ;
//MTE-END [ALPS]
///M:For svlte signal strength. @{
* Set the GSM Signal Strength.
* @param gsmSignalStrength The GSM GSM Signal Strength
public void setGsmSignalStrength(int gsmSignalStrength) {
mGsmSignalStrength = gsmSignalS
* Set the GSM Bit Error Rate.
* @param gsmBitErrorRate the GSM Bit Error Rate
public void setGsmBitErrorRate(int gsmBitErrorRate) {
mGsmBitErrorRate = gsmBitErrorR
* Set the CDMA Dbm.
* @param cdmaDbm the CDMA Dbm
public void setCdmaDbm(int cdmaDbm) {
mCdmaDbm = cdmaD
* Set the CDMA Ecio.
* @param cdmaEcio the CDMA Ecio
public void setCdmaEcio(int cdmaEcio) {
mCdmaEcio = cdmaE
* Set the EVDO Dbm.
* @param evdoDbm the EVDO Dbm
public void setEvdoDbm(int evdoDbm) {
mEvdoDbm = evdoD
* Set the EVDO Ecio.
* @param evdoEcio the EVDO Ecio
public void setEvdoEcio(int evdoEcio) {
mEvdoEcio = evdoE
* Set the EVDO Snr.
* @param evdoSnr the EVDO Snr
public void setEvdoSnr(int evdoSnr) {
mEvdoSnr = evdoS
* Set the LTE Signal Strength.
* @param lteSignalStrength the LTE Signal Strength
public void setLteSignalStrength(int lteSignalStrength) {
mLteSignalStrength = lteSignalS
* Set the LTE Rsrp.
* @param lteRsrp the LTE Rsrp
public void setLteRsrp(int lteRsrp) {
mLteRsrp = lteR
* Set the LTE Rsrq.
* @param lteRsrq the LTE Rsrq
public void setLteRsrq(int lteRsrq) {
mLteRsrq = lteR
* Set the LTE Rssnr.
* @param lteRssnr the LTE Rssnr
public void setLteRssnr(int lteRssnr) {
mLteRssnr = lteR
* Set the LTE Cqi.
* @param lteCqi the LTE Cqi
public void setLteCqi(int lteCqi) {
mLteCqi = lteC
* Set the GSM rssi Qdbm.
* @param gsmRssiQdbm the GSM rssi Qdbm
public void setGsmRssiQdbm(int gsmRssiQdbm) {
mGsmRssiQdbm = gsmRssiQ
* Get the GSM Rscp Qdbm.
* @param gsmRscpQdbm the GSM Rscp Qdbm
public void setGsmRscpQdbm(int gsmRscpQdbm) {
mGsmRscpQdbm = gsmRscpQ
* Set the Gsm Ecn0 Qdbm.
* @param gsmEcn0Qdbm the Gsm Ecn0 Qdbm
public void setGsmEcn0Qdbm(int gsmEcn0Qdbm) {
mGsmEcn0Qdbm = gsmEcn0Q
* Check if C2K feature is supported.
* @return True if C2K feature is supported.
private static boolean isC2KSupport() {
return SystemProperties.get("ro.mtk_c2k_support").equals("1");
/// M: [C2K][SVLTE] Added API for SignalStrength. @}
====================================================================================
vendor/mediatek/proprietary/frameworks/base/packages/FwkPlugin/src/com/mediatek/op/telephony/DefaultServiceStateExt.java代码如下:
/* Copyright Statement:
* This software/firmware and related documentation ("MediaTek Software") are
* protected under relevant copyright laws. The information contained herein is
* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
* the prior written permission of MediaTek inc. and/or its licensors, any
* reproduction, modification, use or disclosure of MediaTek Software, and
* information contained herein, in whole or in part, shall be strictly
* prohibited.
* MediaTek Inc. (C) 2010. All rights reserved.
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
* The following software/firmware and/or related documentation ("MediaTek
* Software") have been modified by MediaTek Inc. All revisions are subject to
* any receiver's applicable license agreements with MediaTek Inc.
package com.mediatek.op.
import android.content.C
import android.content.res.R
import android.os.SystemP
import android.telephony.ServiceS
import android.telephony.SignalS
import android.util.L
import com.mediatek.common.PluginI
import com.mediatek.common.telephony.IServiceStateE
import android.provider.S
import android.telephony.SubscriptionM
import com.android.internal.telephony.P
import com.android.internal.telephony.PhoneC
import com.android.internal.telephony.PhoneB
import com.android.internal.telephony.PhoneF
import com.android.internal.telephony.PhoneP
import java.util.M
@PluginImpl(interfaceName="com.mediatek.common.telephony.IServiceStateExt")
public class DefaultServiceStateExt implements IServiceStateExt {
static final String TAG = "GSM";
private Context mC
public DefaultServiceStateExt() {
public DefaultServiceStateExt(Context context) {
mContext =
public String onUpdateSpnDisplay(String plmn, ServiceState ss, int phoneId) {
/* ALPS */
if (SystemProperties.get("ro.mtk_network_type_always_on").equals("1")) {
// for LTE
if (ss.getRilVoiceRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_LTE
&& plmn != Resources.getSystem().getText(com.android.internal.R.string.
lockscreen_carrier_default).toString()) {
plmn = plmn + " 4G";
} else if (ss.getRilVoiceRadioTechnology() & ServiceState.RIL_RADIO_TECHNOLOGY_EDGE
/* ALPS */
//if (radioTechnology & 2 && plmn != null){
&& plmn != Resources.getSystem().getText(com.android.internal.R.string.
lockscreen_carrier_default).toString()) {
plmn = plmn + " 3G";
public boolean isImeiLocked() {
public boolean isBroadcastEmmrrsPsResume(int value) {
public boolean needEMMRRS() {
public boolean needSpnRuleShowPlmnOnly() {
//[ALPS]-start: don't show SPN for CTA case
if (SystemProperties.get("ro.mtk_cta_support").equals("1")) {
//[ALPS]-end
public boolean needBrodcastAcmt(int errorType, int errorCause) {
public boolean needRejectCauseNotification(int cause) {
public boolean needIgnoredState(int state, int newState, int cause) {
if ((state == ServiceState.STATE_IN_SERVICE) && (newState == 2)) {
/* Don't update for searching state, there shall be final registered state
update later */
Log.i(TAG, "set dontUpdateNetworkStateFlag for searching state");
/* -1 means modem didn't provide
information. */
if (cause != -1) {
// [ALPS] need to check if previous state is IN_SERVICE for invalid sim
if ((state == ServiceState.STATE_IN_SERVICE) && (newState == 3) && (cause != 0)) {
//if((newState == 3) && (cause != 0)){
/* This is likely temporarily network failure, don't update for better UX */
Log.i(TAG, "set dontUpdateNetworkStateFlag for REG_DENIED with cause");
//[ALPS] - start
} else if ((state == ServiceState.STATE_IN_SERVICE) && (newState == 0) && (cause != 0)) {
Log.i(TAG, "set dontUpdateNetworkStateFlag for NOT_REG_AND_NOT_SEARCH with cause");
//[ALPS] - end
Log.i(TAG, "clear dontUpdateNetworkStateFlag");
public boolean ignoreDomesticRoaming() {
public int mapGsmSignalLevel(int asu, int gsmRscpQdbm) {
// [ALPS] -- START , for 3G network
if (gsmRscpQdbm & 0) {
// 3G network
if (asu &= 5 || asu == 99) {
level = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
} else if (asu &= 15) {
level = SignalStrength.SIGNAL_STRENGTH_GREAT;
} else if (asu &= 12) {
level = SignalStrength.SIGNAL_STRENGTH_GOOD;
} else if (asu &= 9) {
level = SignalStrength.SIGNAL_STRENGTH_MODERATE;
level = SignalStrength.SIGNAL_STRENGTH_POOR;
// [ALPS] -- END
// 2G network
if (asu &= 2 || asu == 99) {
level = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
} else if (asu &= 12) {
level = SignalStrength.SIGNAL_STRENGTH_GREAT;
} else if (asu &= 8) {
level = SignalStrength.SIGNAL_STRENGTH_GOOD;
} else if (asu &= 5) {
level = SignalStrength.SIGNAL_STRENGTH_MODERATE;
level = SignalStrength.SIGNAL_STRENGTH_POOR;
//[ALPS][ALPS]-START: change level mapping rule of signal for CMCC
public int mapLteSignalLevel(int mLteRsrp, int mLteRssnr, int mLteSignalStrength) {
//added by ouyang
android.util.Log.e("mapLteSignalLevel", "mapLteSignalLevel starting .......");
* TS 36.214 Physical Layer Section 5.1.3 TS 36.331 RRC RSSI = received
* signal + noise RSRP = reference signal dBm RSRQ = quality of signal
* dB= Number of Resource blocksxRSRP/RSSI SNR = gain=signal/noise ratio
* = -10log P1/P2 dB
int rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
int rsrpIconLevel = -1;
int snrIconLevel = -1;
//modifed by ouyang [] start
if (mLteRsrp & -44) {
rsrpIconLevel = -1;
} else if (mLteRsrp &= -85) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_GREAT;
} else if (mLteRsrp &= -95) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_GOOD;
} else if (mLteRsrp &= -105) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_MODERATE;
} else if (mLteRsrp &= -115) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_POOR;
} else if (mLteRsrp &= -140) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
if (mLteRsrp & -44) {
rsrpIconLevel = -1;
} else if (mLteRsrp &= -97) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_GREAT;
} else if (mLteRsrp &= -105) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_GOOD;
} else if (mLteRsrp &= -110) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_MODERATE;
} else if (mLteRsrp &= -120) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_POOR;
} else if (mLteRsrp &= -140) {
rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
//added by ouyang
android.util.Log.e("mapLteSignalLevel", "getLTELevel - rsrp:" + mLteRsrp + " rsrpIconLevel:"+ rsrpIconLevel);
//modifed by ouyang [] end
* Values are -200 dB to +300 (SNR*10dB) RS_SNR &= 13.0 dB =&4 bars 4.5
* dB &= RS_SNR & 13.0 dB =& 3 bars 1.0 dB &= RS_SNR & 4.5 dB =& 2 bars
* -3.0 dB &= RS_SNR & 1.0 dB 1 bar RS_SNR & -3.0 dB/No Service Antenna
* Icon Only
if (mLteRssnr & 300) {
snrIconLevel = -1;
} else if (mLteRssnr &= 130) {
snrIconLevel = SignalStrength.SIGNAL_STRENGTH_GREAT;
} else if (mLteRssnr &= 45) {
snrIconLevel = SignalStrength.SIGNAL_STRENGTH_GOOD;
} else if (mLteRssnr &= 10) {
snrIconLevel = SignalStrength.SIGNAL_STRENGTH_MODERATE;
} else if (mLteRssnr &= -30) {
snrIconLevel = SignalStrength.SIGNAL_STRENGTH_POOR;
} else if (mLteRssnr &= -200) {
snrIconLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
//added by ouyang
android.util.Log.e("mapLteSignalLevel", "getLTELevel - snr:" + mLteRssnr + " snrIconLevel:" + snrIconLevel);
Log.i(TAG, "getLTELevel - rsrp:" + mLteRsrp + " snr:" + mLteRssnr + " rsrpIconLevel:"
+ rsrpIconLevel + " snrIconLevel:" + snrIconLevel);
/* Choose a measurement type to use for notification */
if (snrIconLevel != -1 && rsrpIconLevel != -1) {
* The number of bars displayed shall be the smaller of the bars
* associated with LTE RSRP and the bars associated with the LTE
//added by ouyang
android.util.Log.e("mapLteSignalLevel", "snrIconLevel != -1 && rsrpIconLevel != -1,"
+"return rsrpIconLevel & snrIconLevel ? rsrpIconLevel : snrIconLevel"
+(rsrpIconLevel & snrIconLevel));
return (rsrpIconLevel & snrIconLevel ? rsrpIconLevel : snrIconLevel);
if (snrIconLevel != -1) {
//added by ouyang
android.util.Log.e("mapLteSignalLevel", "snrIconLevel != -1");
return snrIconL
if (rsrpIconLevel != -1) {
//added by ouyang
android.util.Log.e("mapLteSignalLevel", "rsrpIconLevel != -1");
return rsrpIconL
/* Valid values are (0-63, 99) as defined in TS 36.331 */
if (mLteSignalStrength & 63) {
rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
} else if (mLteSignalStrength &= 12) {
rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_GREAT;
} else if (mLteSignalStrength &= 8) {
rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_GOOD;
} else if (mLteSignalStrength &= 5) {
rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_MODERATE;
} else if (mLteSignalStrength &= 0) {
rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_POOR;
//added by ouyang
android.util.Log.e("mapLteSignalLevel", "getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"
+ rssiIconLevel);
Log.i(TAG, "getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"
+ rssiIconLevel);
return rssiIconL
//[ALPS][ALPS]-END: change level mapping rule of signal for CMCC
public int mapGsmSignalDbm(int gsmRscpQdbm, int asu) {
Log.d(TAG, "mapGsmSignalDbm() gsmRscpQdbm=" + gsmRscpQdbm + " asu=" + asu);
if (gsmRscpQdbm & 0) {
dBm = gsmRscpQdbm / 4; //Return raw value for 3G Network
dBm = -113 + (2 * asu);
return dBm;
public void log(String text) {
Log.d(TAG, text);
public Map loadSpnOverrides() {
public boolean allowSpnDisplayed() {
public boolean supportEccForEachSIM() {
public void updateOplmn(Context context, Object ci) {
//[ALPS] MTK-START: send notification for using some spcial icc card
public boolean needIccCardTypeNotification(String iccCardType) {
//[ALPS]-Start: not supprot auto switch rat for SIM card type
//du to UI spec. define chagend
public int needAutoSwitchRatMode(int phoneId, String nwPlmn) {
return -1;
//[ALPS] To support auto switch rat mode
public int needAutoSwitchRatMode(int phoneId,String nwPlmn) {
int simType = -1; // 0: SIM , 1: USIM
int currentNetworkMode = -1;
int userNetworkMode = -1;
Phone[] phones = //all phone proxy instance
Phone phoneProxy = //current phone proxy instance
// For World phone OM version START
if ((SystemProperties.getInt("ro.mtk_lte_support", 0) == 1) &&
(SystemProperties.getInt("ro.mtk_world_phone", 0) == 1)) {
//get sim switch status
int switchStatus = Integer.valueOf(
SystemProperties.get(PhoneConstants.CAPABILITY_SWITCH_PROP, "1"));
log("needAutoSwitchRatMode,phoneId=" + phoneId+", switchStatus="+switchStatus+
",SubscriptionManager.isValidPhoneId(phoneId)="+SubscriptionManager.isValidPhoneId(phoneId));
if ((phoneId == (switchStatus - 1)) &&
SubscriptionManager.isValidPhoneId(phoneId)) {
phones = PhoneFactory.getPhones();
if (phones.length & phoneId) {
phoneProxy = phones[phoneId];
if (phoneProxy == null) {
log("needSwitchRatMode()= -1 cause phone proxy is null");
return currentNetworkM
String simtype =
simtype = ((PhoneProxy)phoneProxy).getIccCard().getIccCardType();
if (simtype != null && simtype.equals("SIM")) {
simType = 0;
} else if (simtype != null && simtype.equals("USIM")) {
simType = 1;
if (simType == 0) {//SIM
//get rat mode if user has change it
userNetworkMode = Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.USER_PREFERRED_NETWORK_MODE, -1);
if (userNetworkMode &= Phone.NT_MODE_WCDMA_PREF) {
currentNetworkMode = userNetworkM
if(userNetworkMode &= Phone.NT_MODE_LTE_GSM_WCDMA) {
currentNetworkMode = Phone.NT_MODE_WCDMA_PREF;
log("DefaultServiceStateExt needSwitchRatMode for SIM: userNetworkMode=" + userNetworkMode);
//log("needSwitchRatMode: set Rat to 2/3G auto");
currentNetworkMode = Phone.NT_MODE_WCDMA_PREF;
} else if (simType == 1) {//USIM
//get rat mode if user has change it
userNetworkMode = Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.USER_PREFERRED_NETWORK_MODE, -1);
if (userNetworkMode &= Phone.NT_MODE_WCDMA_PREF) {
log("DefaultServiceStateExt needSwitchRatMode for USIM: userNetworkMode=" + userNetworkMode);
currentNetworkMode = userNetworkM
//log("needSwitchRatMode: set Rat to 4/3/2G");
currentNetworkMode = Phone.NT_MODE_LTE_GSM_WCDMA;
log("DefaultServiceStateExt unknown sim type, do nothing");
// For World phone OM version END
log("DefaultServiceStateExt currentNetworkMode = "+currentNetworkMode+" ,simType= "+simType);
return currentNetworkM
//[ALPS]-End
public boolean isSupportRatBalancing() {
* Return if roaming for special SIM.
* @param strServingPlmn The operator numberic get from service state.
* @param strHomePlmn The mcc+mnc get from SIM IMSI.
* @return if roaming for the special SIM
public boolean isRoamingForSpecialSIM(String strServingPlmn, String strHomePlmn) {
====================================================================================
作者:欧阳鹏
欢迎转载,与人分享是进步的源泉!
转载请保留原文地址:
====================================================================================
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?

我要回帖

更多关于 无线信号满格不能上网 的文章

 

随机推荐