Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android系統移植與調試之-------)如何修改Android手機顯示的4G信號強度的格子數

Android系統移植與調試之-------)如何修改Android手機顯示的4G信號強度的格子數

編輯:關於Android編程

在修改顯示的信號強度之前,先了解一下什麼是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時候,信號顯示滿格

data-cke-saved-src=/uploadfile/Collfiles/20151015/2015101508520626.

2、當信號大於等於-95dBm時候,而小於-85dBm時,信號顯示3格

data-cke-saved-src=/uploadfile/Collfiles/20151015/2015101508520627.

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 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 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 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
             * RS_SNR
             */

			//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 snrIconLevel;
        }

        if (rsrpIconLevel != -1) {
			//added by ouyang
			android.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 ouyang
		android.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 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 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 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 [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 ouyang
				android.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 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
             * RS_SNR
             */
             //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 snrIconLevel;
        }

        if (rsrpIconLevel != -1) {
        		//added by ouyang
						android.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 ouyang
				android.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。

data-cke-saved-src=/uploadfile/Collfiles/20151015/2015101508520730.

 

2、當信號大於等於-105dBm時候,而小於-97dBm時,信號顯示少一個,而修改之前需要大於-95dBm。

data-cke-saved-src=/uploadfile/Collfiles/20151015/2015101508520936.

 

3、當信號大於等於-110dBm時候,而小於-105dBm時,信號顯示2格,不好捕捉到。

4、當信號大於等於-120dBm時候,而小於-110dBm時,信號顯示1格,不好捕捉到。

5、當信號大於等於-140dBm時候,而小於-120dBm時,信號顯示0格,不好捕捉到。

 

 

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

當然,要修改電信、移動、聯通的3G、2G信號也可以在這個類中去修改。

最後附上源代碼 rameworksase elephonyjavaandroid elephonySignalStrength.java

 

 

 

 

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

vendor/mediatek/proprietary/frameworks/base/packages/FwkPlugin/src/com/mediatek/op/telephony/DefaultServiceStateExt.java代碼如下:

 

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved