在修改显示的信号强度之前,先了解一下什么是dB,什么是dBm?

1.dB
  dB是一个表征相对值的值,纯粹的比值,只表示两个量的相对大小关系,没有单位,当考虑甲的功率相比于乙功率大或小多少个dB时,

按下面的计算公式:10log(甲功率/乙功率),如果采用两者的电压比计算,要用20log(甲电压/乙电压)。)
  [例] 甲功率比乙功率大一倍,那么10lg(甲功率/乙功率)=10lg2=3dB。也就是说,甲的功率比乙的功率大3 dB。

  反之,如果甲的功率是乙的功率的一半,则甲的功率比乙的功率小3 dB。

2.dBm
  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),那就说明信号很强了.

这里还说一个小知识:

  中国移动的规范规定,手机接收电平>=(城市取-90dBm ;乡村取 -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** @hide*/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[] threshRsrp;if (rsrpThreshType == RSRP_THRESH_TYPE_STRICT) {threshRsrp = RSRP_THRESH_STRICT;} else {threshRsrp = RSRP_THRESH_LENIENT;}//[ALPS01440836][ALPS01594704]-START: change level mapping rule of signal for CMCCif (!IS_BSP_PACKAGE) {IServiceStateExt ssExt = getPlugInInstance();if (ssExt != null) {rsrpIconLevel = ssExt.mapLteSignalLevel(mLteRsrp, mLteRssnr, mLteSignalStrength);//added by ouyangandroid.util.Log.e("oyp", "ssExt != null, rsrpIconLevel:"+ rsrpIconLevel);return rsrpIconLevel;} else {log("[getLteLevel] null plug-in instance");}}//modifed by ouyang [2015-10-12] 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 [2015-10-12] end//added by ouyangandroid.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 ouyangandroid.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* RS_SNR*///added by ouyangandroid.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 ouyangandroid.util.Log.e("oyp", "snrIconLevel != -1");return snrIconLevel;}if (rsrpIconLevel != -1) {//added by ouyangandroid.util.Log.e("oyp", "rsrpIconLevel != -1");return rsrpIconLevel;}/* 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 ouyangandroid.util.Log.e("oyp", "getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"+ rssiIconLevel);if (DBG) {log("getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"+ rssiIconLevel);}return rssiIconLevel;//[ALPS01440836][ALPS01594704]-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如下:

//[ALPS01440836][ALPS01594704]-START: change level mapping rule of signal for CMCCif (!IS_BSP_PACKAGE) {IServiceStateExt ssExt = getPlugInInstance();if (ssExt != null) {rsrpIconLevel = ssExt.mapLteSignalLevel(mLteRsrp, mLteRssnr, mLteSignalStrength);//added by ouyangandroid.util.Log.e("oyp", "ssExt != null, rsrpIconLevel:"+ rsrpIconLevel);return rsrpIconLevel;} else {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

修改后代码如下:

  //[ALPS01440836][ALPS01594704]-START: change level mapping rule of signal for CMCCpublic int mapLteSignalLevel(int mLteRsrp, int mLteRssnr, int mLteSignalStrength) {//added by ouyangandroid.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 [2015-10-14] 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 ouyangandroid.util.Log.e("mapLteSignalLevel", "getLTELevel - rsrp:" + mLteRsrp + " rsrpIconLevel:"+ rsrpIconLevel);//modifed by ouyang [2015-10-14] 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 ouyangandroid.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* RS_SNR*///added by ouyangandroid.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 ouyangandroid.util.Log.e("mapLteSignalLevel", "snrIconLevel != -1");return snrIconLevel;}if (rsrpIconLevel != -1) {//added by ouyangandroid.util.Log.e("mapLteSignalLevel", "rsrpIconLevel != -1");return rsrpIconLevel;}/* 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 ouyangandroid.util.Log.e("mapLteSignalLevel", "getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"+ rssiIconLevel);Log.i(TAG, "getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"+ rssiIconLevel);return rssiIconLevel;}//[ALPS01440836][ALPS01594704]-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.telephony;import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.telephony.Rlog;
import android.content.res.Resources;
import android.os.SystemProperties;import com.mediatek.common.MPlugin;
import com.mediatek.common.telephony.IServiceStateExt;/*** Contains phone signal strength related information.*/
public class SignalStrength implements Parcelable {private static final String LOG_TAG = "SignalStrength";private static final boolean DBG = false;/** @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 strengthpublic 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 mGsmSignalStrength; // Valid values are (0-31, 99) as defined in TS 27.007 8.5private int mGsmBitErrorRate;   // bit error rate (0-7, 99) as defined in TS 27.007 8.5private int mCdmaDbm;   // This value is the RSSI valueprivate int mCdmaEcio;  // This value is the Ec/Ioprivate int mEvdoDbm;   // This value is the EVDO RSSI valueprivate int mEvdoEcio;  // This value is the EVDO Ec/Ioprivate int mEvdoSnr;   // Valid values are 0-8.  8 is the highest signal to noise ratioprivate int mLteSignalStrength;private int mLteRsrp;private int mLteRsrq;private int mLteRssnr;private int mLteCqi;//MTK-STARTprivate int mGsmRssiQdbm; // This valus is GSM 3G rssi valueprivate int mGsmRscpQdbm; // This valus is GSM 3G rscp valueprivate int mGsmEcn0Qdbm; // This valus is GSM 3G ecn0 valueprivate static IServiceStateExt mServiceStateExt = null;private static final boolean IS_BSP_PACKAGE = (SystemProperties.getInt("ro.mtk_bsp_package", 0) == 1);//MTK-ENDprivate boolean isGsm; // 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** @hide*/public static SignalStrength newFromBundle(Bundle m) {SignalStrength ret;ret = new SignalStrength();ret.setFromNotifierBundle(m);return ret;}/*** Empty constructor** @hide*/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;isGsm = true;}/*** 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* @hide*/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 = gsmFlag;}/*** Constructor** @hide*/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** @hide*/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 = gsmRssiQdbm;mGsmRscpQdbm = gsmRscpQdbm;mGsmEcn0Qdbm = gsmEcn0Qdbm;}//MTK-END/*** Constructor** @hide*/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** @hide*/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** @hide*/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** @hide*/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 = gsmSignalStrength;mGsmBitErrorRate = gsmBitErrorRate;mCdmaDbm = cdmaDbm;mCdmaEcio = cdmaEcio;mEvdoDbm = evdoDbm;mEvdoEcio = evdoEcio;mEvdoSnr = evdoSnr;mLteSignalStrength = lteSignalStrength;mLteRsrp = lteRsrp;mLteRsrq = lteRsrq;mLteRssnr = lteRssnr;mLteCqi = lteCqi;isGsm = gsm;if (DBG) {log("initialize: " + toString());}}private static IServiceStateExt getPlugInInstance() {log("SignalStrength get plugin");if (!IS_BSP_PACKAGE) {if (mServiceStateExt == null) {try {mServiceStateExt = MPlugin.createInstance(IServiceStateExt.class.getName());} catch (RuntimeException e) {log("Get plugin fail");mServiceStateExt = null;e.printStackTrace();}}} else {log("BSP package should not use plug in");}return mServiceStateExt;}/*** @hide*/protected void copyFrom(SignalStrength s) {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;mGsmRssiQdbm = s.mGsmRssiQdbm;mGsmRscpQdbm = s.mGsmRscpQdbm;mGsmEcn0Qdbm = s.mGsmEcn0Qdbm;}/*** Construct a SignalStrength object from the given parcel.** @hide*/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 [ALPS00516994]mGsmRssiQdbm = in.readInt();mGsmRscpQdbm = in.readInt();mGsmEcn0Qdbm = in.readInt();//MTK-END [ALPS00516994]}/*** 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.** @hide*/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 [ALPS00516994]ss.mGsmRssiQdbm = in.readInt();ss.mGsmRscpQdbm = in.readInt();ss.mGsmEcn0Qdbm = in.readInt();//MTK-END [ALPS00516994]return ss;}/*** {@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 [ALPS00516994]out.writeInt(mGsmRssiQdbm);out.writeInt(mGsmRscpQdbm);out.writeInt(mGsmEcn0Qdbm);//MTK-END [ALPS00516994]}/*** {@link Parcelable#describeContents}*/public int describeContents() {return 0;}/*** {@link Parcelable.Creator}** @hide*/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** @return*      Valid values for all signalstrength fields* @hide*/public void validateInput() {if (DBG) {log("Signal before validate=" + this);}// TS 27.007 8.5mGsmSignalStrength = mGsmSignalStrength >= 0 ? mGsmSignalStrength : 99;// BER no change;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 RRCmLteSignalStrength = (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 changeif (DBG) {log("Signal after validate=" + this);}}/*** @param true - Gsm, Lte phones*        false - Cdma phones** Used by voice phone to set the isGsm*        flag* @hide*/public void setGsm(boolean gsmFlag) {isGsm = gsmFlag;}/*** Get the GSM Signal Strength, valid values are (0-31, 99) as defined in TS* 27.007 8.5*/public int getGsmSignalStrength() {return this.mGsmSignalStrength;}/*** Get the GSM bit error rate (0-7, 99) as defined in TS 27.007 8.5*/public int getGsmBitErrorRate() {return this.mGsmBitErrorRate;}/*** Get the CDMA RSSI value in dBm*/public int getCdmaDbm() {return this.mCdmaDbm;}/*** Get the CDMA Ec/Io value in dB*10*/public int getCdmaEcio() {return this.mCdmaEcio;}/*** Get the EVDO RSSI value in dBm*/public int getEvdoDbm() {return this.mEvdoDbm;}/*** Get the EVDO Ec/Io value in dB*10*/public int getEvdoEcio() {return this.mEvdoEcio;}/*** Get the signal to noise ratio. Valid values are 0-8. 8 is the highest.*/public int getEvdoSnr() {return this.mEvdoSnr;}/** @hide */public int getLteSignalStrength() {return mLteSignalStrength;}/** @hide */public int getLteRsrp() {return mLteRsrp;}/** @hide */public int getLteRsrq() {return mLteRsrq;}/** @hide */public int getLteRssnr() {return mLteRssnr;}/** @hide */public int getLteCqi() {return mLteCqi;}/*** Get signal level as an int from 0..4** @hide*/public int getLevel() {int level;if (isGsm) {level = getLteLevel();//MTE-START [ALPS01200757]//if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {if (!isCampOnLte()) {//MTE-END [ALPS01200757]level = getGsmLevel();}} else {int cdmaLevel = getCdmaLevel();int evdoLevel = getEvdoLevel();if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {/* We don't know evdo, use cdma */level = cdmaLevel;} else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {/* We don't know cdma, use evdo */level = evdoLevel;} else {/* We know both, use the lowest level */level = cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel;}}if (DBG) {log("getLevel=" + level);}return level;}/*** Get the signal level as an asu value between 0..31, 99 is unknown** @hide*/public int getAsuLevel() {int asuLevel;if (isGsm) {//MTE-START [ALPS01200757]//if (getLteLevel() == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {if (!isCampOnLte()) {//MTE-END [ALPS01200757]asuLevel = getGsmAsuLevel();} else {asuLevel = getLteAsuLevel();}} else {int cdmaAsuLevel = getCdmaAsuLevel();int evdoAsuLevel = getEvdoAsuLevel();if (evdoAsuLevel == 0) {/* We don't know evdo use, cdma */asuLevel = cdmaAsuLevel;} else if (cdmaAsuLevel == 0) {/* We don't know cdma use, evdo */asuLevel = evdoAsuLevel;} else {/* We know both, use the lowest level */asuLevel = cdmaAsuLevel < evdoAsuLevel ? cdmaAsuLevel : evdoAsuLevel;}}if (DBG) {log("getAsuLevel=" + asuLevel);}return asuLevel;}/*** Get the signal strength as dBm** @hide*/public int getDbm() {int dBm;if(isGsm()) {dBm = getLteDbm();//MTE-START [ALPS01200757]//if (dBm == INVALID) {if (!isCampOnLte()) {//MTE-END [ALPS01200757]dBm = getGsmDbm();}} else {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** @hide*/public int getGsmDbm() {int dBm;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);} else {log("[getGsmDbm] null plug-in instance");}}log("mapGsmSignalDbm() mGsmRscpQdbm=" + mGsmRscpQdbm + " asu=" + asu);if (mGsmRscpQdbm < 0) {dBm = mGsmRscpQdbm / 4; //Return raw value for 3G Network} else {dBm = -113 + (2 * asu);}} else {dBm = -1;}if (DBG) {log("getGsmDbm=" + dBm);}return dBm;}/*** Get gsm as level 0..4** @hide*/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();if (!IS_BSP_PACKAGE) {IServiceStateExt ssExt = getPlugInInstance();if (ssExt != null) {level = ssExt.mapGsmSignalLevel(asu, mGsmRscpQdbm);return level;} else {log("[getGsmLevel] null plug-in instance");}}// [ALPS01055164] -- START , for 3G networkif (mGsmRscpQdbm < 0) {// 3G networkif (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;} else {level = SignalStrength.SIGNAL_STRENGTH_POOR;}// [ALPS01055164] -- END} else {// 2G networkif (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;}/*** Get the gsm signal level as an asu value between 0..31, 99 is unknown** @hide*/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);}return level;}/*** Get cdma as level 0..4** @hide*/public int getCdmaLevel() {final int cdmaDbm = getCdmaDbm();final int cdmaEcio = getCdmaEcio();int levelDbm;int levelEcio;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*10if (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 : levelEcio;/// M: [C2K] Only use dbm as to calculate level. @{if (isC2KSupport()) {level = levelDbm;}/// M: [C2K] Only use dbm as to calculate level. @}if (DBG) {log("getCdmaLevel=" + level);}return level;}/*** Get the cdma signal level as an asu value between 0..31, 99 is unknown** @hide*/public int getCdmaAsuLevel() {final int cdmaDbm = getCdmaDbm();final int cdmaEcio = getCdmaEcio();int cdmaAsuLevel;int ecioAsuLevel;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*10if (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 : ecioAsuLevel;if (DBG) {log("getCdmaAsuLevel=" + level);}return level;}/*** Get Evdo as level 0..4** @hide*/public int getEvdoLevel() {int evdoDbm = getEvdoDbm();int evdoSnr = getEvdoSnr();int levelEvdoDbm;int levelEvdoSnr;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 : levelEvdoSnr;if (DBG) {log("getEvdoLevel=" + level);}return level;}/*** Get the evdo signal level as an asu value between 0..31, 99 is unknown** @hide*/public int getEvdoAsuLevel() {int evdoDbm = getEvdoDbm();int evdoSnr = getEvdoSnr();int levelEvdoDbm;int levelEvdoSnr;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 : levelEvdoSnr;if (DBG) {log("getEvdoAsuLevel=" + level);}return level;}/*** Get LTE as dBm** @hide*/public int getLteDbm() {return mLteRsrp;}/*** Get LTE as level 0..4** @hide*/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[] threshRsrp;if (rsrpThreshType == RSRP_THRESH_TYPE_STRICT) {threshRsrp = RSRP_THRESH_STRICT;} else {threshRsrp = RSRP_THRESH_LENIENT;}//[ALPS01440836][ALPS01594704]-START: change level mapping rule of signal for CMCCif (!IS_BSP_PACKAGE) {IServiceStateExt ssExt = getPlugInInstance();if (ssExt != null) {rsrpIconLevel = ssExt.mapLteSignalLevel(mLteRsrp, mLteRssnr, mLteSignalStrength);//added by ouyangandroid.util.Log.e("oyp", "ssExt != null, rsrpIconLevel:"+ rsrpIconLevel);return rsrpIconLevel;} else {log("[getLteLevel] null plug-in instance");}}//modifed by ouyang [2015-10-12] 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 [2015-10-12] end//added by ouyangandroid.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 ouyangandroid.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* RS_SNR*///added by ouyangandroid.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 ouyangandroid.util.Log.e("oyp", "snrIconLevel != -1");return snrIconLevel;}if (rsrpIconLevel != -1) {//added by ouyangandroid.util.Log.e("oyp", "rsrpIconLevel != -1");return rsrpIconLevel;}/* 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 ouyangandroid.util.Log.e("oyp", "getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"+ rssiIconLevel);if (DBG) {log("getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"+ rssiIconLevel);}return rssiIconLevel;//[ALPS01440836][ALPS01594704]-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** @hide*/public int getLteAsuLevel() {int lteAsuLevel = 99;int lteDbm = getLteDbm();/** 3GPP 27.007 (Ver 10.3.0) Sec 8.69* 0   -140 dBm or less* 1   -139 dBm* 2...96  -138... -44 dBm* 97  -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;} else {lteAsuLevel = lteDbm + 140;}if (DBG) {log("Lte Asu level: " + lteAsuLevel);}return lteAsuLevel;}/*** @return true if this is for GSM*/public boolean isGsm() {return this.isGsm;}/*** @return hash code*/@Overridepublic 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*/@Overridepublic boolean equals (Object o) {SignalStrength s;try {s = (SignalStrength) o;} catch (ClassCastException ex) {return false;}if (o == null) {return false;}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); /* ALPS00334516 */}/*** @return string representation.*/@Overridepublic 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* @hide*/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* @hide*/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);}/*** log*/private static void log(String s) {Rlog.w(LOG_TAG, s);}/*** Get the GSM 3G rssi value** @hide*/public int getGsmRssiQdbm() {return this.mGsmRssiQdbm;}/*** Get the GSM 3G rscp value** @hide*/public int getGsmRscpQdbm() {return this.mGsmRscpQdbm;}/*** Get the GSM 3G ecn0 value** @hide*/public int getGsmEcn0Qdbm() {return this.mGsmEcn0Qdbm;}/*** Get the GSM Signal Strength Dbm value** @hide* @internal*/public int getGsmSignalStrengthDbm() {int dBm = -1;int gsmSignalStrength = this.mGsmSignalStrength;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;} else {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* @hide*/private static boolean equalsHandlesNulls(Object a, Object b) {return (a == null) ? (b == null) : a.equals(b);}//MTE-START [ALPS01200757]/*** 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** @hide* @internal*/private boolean isCampOnLte() {return (isGsm() && (mEvdoDbm == -7)) ;}//MTE-END [ALPS01200757]///M:For svlte signal strength. @{/*** Set the GSM Signal Strength.** @param gsmSignalStrength The GSM GSM Signal Strength* @hide*/public void setGsmSignalStrength(int gsmSignalStrength) {mGsmSignalStrength = gsmSignalStrength;}/*** Set the GSM Bit Error Rate.** @param gsmBitErrorRate the GSM Bit Error Rate* @hide*/public void setGsmBitErrorRate(int gsmBitErrorRate) {mGsmBitErrorRate = gsmBitErrorRate;}/*** Set the CDMA Dbm.** @param cdmaDbm the CDMA Dbm* @hide*/public void setCdmaDbm(int cdmaDbm) {mCdmaDbm = cdmaDbm;}/*** Set the CDMA Ecio.** @param cdmaEcio the CDMA Ecio* @hide*/public void setCdmaEcio(int cdmaEcio) {mCdmaEcio = cdmaEcio;}/*** Set the EVDO Dbm.** @param evdoDbm the EVDO Dbm* @hide*/public void setEvdoDbm(int evdoDbm) {mEvdoDbm = evdoDbm;}/*** Set the EVDO Ecio.** @param evdoEcio the EVDO Ecio* @hide*/public void setEvdoEcio(int evdoEcio) {mEvdoEcio = evdoEcio;}/*** Set the EVDO Snr.** @param evdoSnr the EVDO Snr* @hide*/public void setEvdoSnr(int evdoSnr) {mEvdoSnr = evdoSnr;}/*** Set the LTE Signal Strength.** @param lteSignalStrength the LTE Signal Strength* @hide*/public void setLteSignalStrength(int lteSignalStrength) {mLteSignalStrength = lteSignalStrength;}/*** Set the LTE Rsrp.** @param lteRsrp the LTE Rsrp* @hide*/public void setLteRsrp(int lteRsrp) {mLteRsrp = lteRsrp;}/*** Set the LTE Rsrq.** @param lteRsrq the LTE Rsrq* @hide*/public void setLteRsrq(int lteRsrq) {mLteRsrq = lteRsrq;}/*** Set the LTE Rssnr.** @param lteRssnr the LTE Rssnr* @hide*/public void setLteRssnr(int lteRssnr) {mLteRssnr = lteRssnr;}/*** Set the LTE Cqi.** @param lteCqi the LTE Cqi* @hide*/public void setLteCqi(int lteCqi) {mLteCqi = lteCqi;}/*** Set the GSM rssi Qdbm.** @param gsmRssiQdbm the GSM rssi Qdbm* @hide*/public void setGsmRssiQdbm(int gsmRssiQdbm) {mGsmRssiQdbm = gsmRssiQdbm;}/*** Get the GSM Rscp Qdbm.** @param gsmRscpQdbm the GSM Rscp Qdbm* @hide*/public void setGsmRscpQdbm(int gsmRscpQdbm) {mGsmRscpQdbm = gsmRscpQdbm;}/*** Set the Gsm Ecn0 Qdbm.** @param gsmEcn0Qdbm the Gsm Ecn0 Qdbm* @hide*/public void setGsmEcn0Qdbm(int gsmEcn0Qdbm) {mGsmEcn0Qdbm = gsmEcn0Qdbm;}/*** 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.telephony;import android.content.Context;
import android.content.res.Resources;
import android.os.SystemProperties;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.util.Log;import com.mediatek.common.PluginImpl;
import com.mediatek.common.telephony.IServiceStateExt;
import android.provider.Settings;
import android.telephony.SubscriptionManager;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.PhoneBase;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.PhoneProxy;import java.util.Map;@PluginImpl(interfaceName="com.mediatek.common.telephony.IServiceStateExt")
public class DefaultServiceStateExt implements IServiceStateExt {static final String TAG = "GSM";private Context mContext;public DefaultServiceStateExt() {}public DefaultServiceStateExt(Context context) {mContext = context;}public String onUpdateSpnDisplay(String plmn, ServiceState ss, int phoneId) {/* ALPS00362903 */if (SystemProperties.get("ro.mtk_network_type_always_on").equals("1")) {// for LTEif (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/* ALPS00492303 *///if (radioTechnology > 2 && plmn != null){&& plmn != Resources.getSystem().getText(com.android.internal.R.string.lockscreen_carrier_default).toString()) {plmn = plmn + " 3G";}}return plmn;}public boolean isImeiLocked() {return false;}public boolean isBroadcastEmmrrsPsResume(int value) {return false;}public boolean needEMMRRS() {return false;}public boolean needSpnRuleShowPlmnOnly() {//[ALPS01679495]-start: don't show SPN for CTA caseif (SystemProperties.get("ro.mtk_cta_support").equals("1")) {return true;}//[ALPS01679495]-endreturn false;}public boolean needBrodcastAcmt(int errorType, int errorCause) {return false;}public boolean needRejectCauseNotification(int cause) {return false;}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 stateupdate later */Log.i(TAG, "set dontUpdateNetworkStateFlag for searching state");return true;}/* -1 means modem didn't provide  information. */if (cause != -1) {// [ALPS01384143] need to check if previous state is IN_SERVICE for invalid simif ((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");return true;//[ALPS01976914] - 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");return true;}//[ALPS01976914] - end}Log.i(TAG, "clear dontUpdateNetworkStateFlag");return false;}public boolean ignoreDomesticRoaming() {return false;}public int mapGsmSignalLevel(int asu, int gsmRscpQdbm) {int level;// [ALPS01055164] -- START , for 3G networkif (gsmRscpQdbm < 0) {// 3G networkif (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;} else {level = SignalStrength.SIGNAL_STRENGTH_POOR;}// [ALPS01055164] -- END} else {// 2G networkif (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;} else {level = SignalStrength.SIGNAL_STRENGTH_POOR;}}return level;}//[ALPS01440836][ALPS01594704]-START: change level mapping rule of signal for CMCCpublic int mapLteSignalLevel(int mLteRsrp, int mLteRssnr, int mLteSignalStrength) {//added by ouyangandroid.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 [2015-10-14] 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 ouyangandroid.util.Log.e("mapLteSignalLevel", "getLTELevel - rsrp:" + mLteRsrp + " rsrpIconLevel:"+ rsrpIconLevel);//modifed by ouyang [2015-10-14] 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 ouyangandroid.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* RS_SNR*///added by ouyangandroid.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 ouyangandroid.util.Log.e("mapLteSignalLevel", "snrIconLevel != -1");return snrIconLevel;}if (rsrpIconLevel != -1) {//added by ouyangandroid.util.Log.e("mapLteSignalLevel", "rsrpIconLevel != -1");return rsrpIconLevel;}/* 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 ouyangandroid.util.Log.e("mapLteSignalLevel", "getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"+ rssiIconLevel);Log.i(TAG, "getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"+ rssiIconLevel);return rssiIconLevel;}//[ALPS01440836][ALPS01594704]-END: change level mapping rule of signal for CMCCpublic int mapGsmSignalDbm(int gsmRscpQdbm, int asu) {int dBm;Log.d(TAG, "mapGsmSignalDbm() gsmRscpQdbm=" + gsmRscpQdbm + " asu=" + asu);if (gsmRscpQdbm < 0) {dBm = gsmRscpQdbm / 4; //Return raw value for 3G Network} else {dBm = -113 + (2 * asu);}return dBm;}public void log(String text) {Log.d(TAG, text);}public Map loadSpnOverrides() {return null;}public boolean allowSpnDisplayed() {return true;}public boolean supportEccForEachSIM() {return false;}public void updateOplmn(Context context, Object ci) {}//[ALPS01558804] MTK-START: send notification for using some spcial icc cardpublic boolean needIccCardTypeNotification(String iccCardType) {return false;}//[ALPS01862093]-Start: not supprot auto switch rat for SIM card type//du to UI spec. define chagendpublic int needAutoSwitchRatMode(int phoneId, String nwPlmn) {return -1;}//re-mark/*//[ALPS01577029] To support auto switch rat modepublic int needAutoSwitchRatMode(int phoneId,String nwPlmn) {int simType = -1; // 0: SIM , 1: USIMint currentNetworkMode = -1;int userNetworkMode = -1;Phone[] phones = null; //all phone proxy instancePhone phoneProxy = null; //current phone proxy instance// For World phone OM version STARTif ((SystemProperties.getInt("ro.mtk_lte_support", 0) == 1) &&(SystemProperties.getInt("ro.mtk_world_phone", 0) == 1)) {//get sim switch statusint 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 currentNetworkMode;}String simtype = null;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 ituserNetworkMode = Settings.Global.getInt(mContext.getContentResolver(),Settings.Global.USER_PREFERRED_NETWORK_MODE, -1);if (userNetworkMode >= Phone.NT_MODE_WCDMA_PREF) {currentNetworkMode = userNetworkMode;if(userNetworkMode >= Phone.NT_MODE_LTE_GSM_WCDMA) {currentNetworkMode = Phone.NT_MODE_WCDMA_PREF;}log("DefaultServiceStateExt needSwitchRatMode for SIM: userNetworkMode=" + userNetworkMode);} else {//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 ituserNetworkMode = 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 = userNetworkMode;} else {//log("needSwitchRatMode: set Rat to 4/3/2G");currentNetworkMode = Phone.NT_MODE_LTE_GSM_WCDMA;}} else {log("DefaultServiceStateExt unknown sim type, do nothing");}}}// For World phone OM version ENDlog("DefaultServiceStateExt currentNetworkMode = "+currentNetworkMode+" ,simType= "+simType);return currentNetworkMode;}*///[ALPS01862093]-Endpublic boolean isSupportRatBalancing() {return false;}/*** 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) {return false;}
}

====================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

====================================================================================

转载于:https://www.cnblogs.com/ouyangpeng/p/8537867.html

Android系统移植与调试之-------如何修改Android手机显示的4G信号强度的格子数相关推荐

  1. Android系统移植与调试之-------如何修改Android设备添加重启、飞行模式、静音模式等功能(一)...

    1.首先先来看一下修改前后的效果对比图 修改之后的图片 确认重启界面 具体的修改内容在下一篇中具体介绍. Android系统移植与调试之------->如何修改Android设备添加重启.飞行模 ...

  2. Android手机显示的4G信号强度的格子数

    如何修改Android手机显示的4G信号强度的格子数?在修改显示的信号强度之前,先了解一下什么是dB,什么是dBm? 1.dB dB是一个表征相对值的值,纯粹的比值,只表示两个量的相对大小关系,没有单 ...

  3. Android系统移植与调试之如何修改Android系统默认显示【开发者选项】并默认打开【USB调试】和【未知来源】开关

    转自:[http://blog.csdn.net/ouyang_peng] http://blog.csdn.net/qq446282412/article/details/49815865 今天有个 ...

  4. Android系统移植与调试之-------)如何修改Android手机NFC模块,使黑屏时候能够使用NFC

    我们都知道在不修改源代码的情况下,只能是解锁之后才能使用NFC功能.而在锁屏和黑屏2个状态下是没办法用NFC的,但是最近有个客户要求手机在黑屏状态下能够使用NFC,因此我们需要去修改Android源代 ...

  5. Android系统移植与调试之-------Amlogic方案编译步骤

    1. 拷贝Amlogic的SourceCode 切换目录到  /home/roco/work/amlogic/SourceCode/mx0831-0525下将mx0831-0525.tgz拷贝到  / ...

  6. Android系统移植与调试之-------build.prop文件详细赏析

    小知识:什么是build.prop?   /system/build.prop 是一个属性文件,在Android系统中.prop文件很重要,记录了系统的设置和改变,类似於/etc中的文件.这个文件是如 ...

  7. Android系统移植canutils

    Android系统移植canutils 下载代码并编写Android.bp/Android.mk 这里我已经写好了编译脚本了,打包了canutils和libsocketcan代码,到这里下载 http ...

  8. Android系统移植:驱动篇

    [导语]在Android系统移植中,有很重要的一个部分工作,就是为新平台上的硬件设备移植驱动程序.因为Android系统是基于Linux kernel内核构建,所以这里说的移植驱动程序,其实就是基于A ...

  9. android系统移植之按键驱动篇

    平台:MX53_QSB开发板 MX53_QSB开发板上一起有四个按键,分别为RESET,POWER,USER1,USER2.其中RESET为纯硬件复位按键,无须软件控制.POWER,USER1,USE ...

  10. 深入浅出 - Android系统移植与平台开发(五)- 定制手机模拟器ROM

    作者:唐老师,华清远见嵌入式学院讲师. 一. 修改化定制Android4.0系统 Android系统启动时,先加载Linux内核,在Linux的framebuffer驱动里可以定制开机界面,Linux ...

最新文章

  1. Linux编程之自定义消息队列
  2. SQLite管理工具绿色
  3. 新站SEO优化五点注意事项!
  4. Java中的类型安全的空集合
  5. 移动端vant时间选择器_vue移动端组件库(vant)
  6. 高等数学复习笔记(三)- 中值定理
  7. Mysql如何清空数据库的单表数据 , 所有表数据
  8. 【爬虫进阶】验证码处理:打码平台的使用(反反爬)
  9. 非系统盘根目录出现Msdia80.dll文件如何处理
  10. Windows开启ssh服务配合 IOS 快捷指令完成骚操作
  11. illegal offset type php,PHP warning Illegal offset type错误解决办法
  12. 图片占位符生成器holder.js的简单使用
  13. php获取手机号码6,php随机生成姓名,手机号,6位数
  14. matlab 冲激偶,冲激函数符号怎么念 什么是冲激函数?
  15. WLGK-51单片机接口技术基础实验 ——LED闪烁灯
  16. 项目管理必看书籍推荐,15本全送给你
  17. yaml的基本语法格式
  18. 运算符副作用总结与例子(js)
  19. 2017最新PHP面试题
  20. 互联网晚报 | 8月17日 星期三 | ​龙湖回应网传将于8月底破产;苹果因搜包向零售员工赔偿2亿;便利蜂回应​被传“大幅关店”...

热门文章

  1. atitit.html编辑器的设计要点与框架选型 attilax总结
  2. paip.jquery ajax 请求JSON数据填充SELECT全过程纪录
  3. Julia :复合类型struct当索引时
  4. (转)吴寿鹤:区块链中的软分叉与硬分叉详解
  5. Julia: readdlm
  6. 阿里巴巴集团数据库运维经验分享
  7. 【光学】基于matlab GUI带切趾的光线布拉格光栅滤波特性仿真【含Matlab源码 1505期】
  8. 【情感识别】基于matlab GUI SVM语音情感识别【含Matlab源码 869期】
  9. 【图像计数】基于matlab灰度二值化同类物体简单计数【含Matlab源码 759期】
  10. 【数字信号】基于matlab 8级m序列【含Matlab源码 353期】