本人主要研究的方向是android的telephony 和gps ,这两天在做信号格数优化的功能,android默认的最大的信号格数是4格,现在业界通用的做法是最大格数为5格,这样用户看起来视觉效果好些。所以本人的工作就是把最大信号格数改为5格。
一:信号格数主要涉及的文件:
由于涉及显示信号格数的文件比较多,知道这里介绍的文件,对你优化信号格数已经足够了,这些文件都在frameworks\base\packages\SystemUI目录下。
(1)telephonyIcons.java:此文件中定义了各种显示图片,其实我们在手机界面的看到的不同格数是由不同的图片显示的,如下图所示,android通过数组定义了不同的信号格数图片。
(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转化为对应的图片。
如果大家还有什么疑问,可以微博私信我。