Android的信号格数显示优化

         本人主要研究的方向是android的telephony 和gps ,这两天在做信号格数优化的功能,android默认的最大的信号格数是4格,现在业界通用的做法是最大格数为5格,这样用户看起来视觉效果好些。所以本人的工作就是把最大信号格数改为5格。

           一:信号格数主要涉及的文件:

           由于涉及显示信号格数的文件比较多,知道这里介绍的文件,对你优化信号格数已经足够了,这些文件都在frameworks\base\packages\SystemUI目录下。  

          (1)telephonyIcons.java:此文件中定义了各种显示图片,其实我们在手机界面的看到的不同格数是由不同的图片显示的,如下图所示,android通过数组定义了不同的信号格数图片。

             

                   Android的信号格数显示优化_第1张图片

          (2)SignalStrength.java:此文件是android根据不同的信号参数来通过不同的方式划分信号格数。

                          SignalStrength.java 文件中定义了各种衡量信号的成员变量,以下列举几个成员变量,仅供参考。

                                 private  int mGsmSignalStrength;//valid values are (0-31,99),as defined 3gpp TS27.007 section 8.5,其实这值可以用AT命令at+CSQ?查询。

                                 private  int mGsmBitErrorRate;//bit error rate (0-7,99),as defined 3gpp TS27.007 section 8.5

                                 private int mCmdaDbm;//this value is the rssi value.

                          大家看了这个java文件后,会发现们没有WCDMA的元素,经过跟踪log,我发现WCDMA和GSM共用一套变量和函数。

                          SignalStrength.java中还定义了整形信号格数的静态成员变量,android把这些静态成员变量映射为不同的格数的图片,我们可以发现android默认是以4格来划分信号的。

                                private static final int SIGNAL_STRENGTH_NONE_OR_UNKNOW=-0;//代表信号格数是0格。

                                private static final int SIGNAL_STRENGTH_POOR=1;//代表信号格数是一格。

                                private static final int SIGNAL_STRENGTH_MODERATE=2;//代表信号格数是两格。

                                private static final int SIGNAL_STRENGTH_GOOD=3;//代表信号格数是三格。

                                private static final int SIGNAL_STRENGTH_GREAT=4;//代表信号格数是四格。

                         SignalStrength.java中还定义了获取各种制式下的信号格数:

                             public int  getGsmLevel();//获取GSM的信号格数。

                             public int  getLteLevel();//获取LTE的信号格数。

         (3) MsimnetworkController.java:

                          信号格数的实时更新就是在该文件中进行的。我们可以发现这个文件是以MSim开头的,代表这个文件是跟多SIM卡相关的。由于本人的项目是双SIM卡,所以更新信号的函数是在这个文件中。如果是单SIM卡的话,信号格数的更新是在NetworkController.java文件中。

                           更新信号格数在函数updateTelePhonySignalStrength(int subscription)中进行的,参数subscription代表卡,为0时表示主卡,为1时表示副卡。  这个函数有一个重要的局部变量int [] iconList。这个数组是用来存放我们使用的是哪一组信号格数图片,有如下代码可以为证:

                          iconList=TelephonyIcons.TELEPHONY_SIGNAL_PLUS[subscription][mInetCondition];

                          首先在函数的开始判断了终端是否注册上网络,如果没有注册上,则把信号格数图片设置为无信号。

                           if (!hasService(subscription) &&  (mMSimDataServiceState[subscription] != ServiceState.STATE_IN_SERVICE))

                          {           

                                   if (DEBUG) Slog.d(TAG, " No service");   

                                    mMSimPhoneSignalIconId[subscription] = TelephonyIcons.getSignalNullIcon(subscription);   

                                    mMSimDataSignalIconId[subscription] = mMSimPhoneSignalIconId[subscription];           

                                    if (dataSub == subscription)  mQSPhoneSignalIconId = R.drawable.ic_qs_signal_no_signal;     

                         }         

;                     在文件的末尾:MsimPhoneSignalconId[subscription][FIRST_SIGNAL_ICON]=iconList[iconlevel];

                      iconlevel代表获取的信号格数,在这儿把整形变量的信号格数通过数组iconList转化为对应的图片。

                      如果大家还有什么疑问,可以微博私信我。

                  

你可能感兴趣的:(android)