最近的一个新需求,需要把android原生的四个信号条改为五格信号条,一下是本人的解决方案:(注;这里主要是针对gsm网络)
android 2.3:
a. modem底层上报信号参数RSSI给modem L4
b. 在modem L4中,经过计算的到上报给上层的asu值,asu的范围是0-31,计算公式为:
asu = (-113 + RSSI) / 2
c. 在SatusBarPolicy.java中的updateSignalStrength(int simId)方法中(单卡情况为updateSignalStrength()),将asu值转化为信号格数,将asu的取值范围对应相应iconlevel就ok了
2.3就不做详细描述了 ,具体修改参考android 4. 0
android 4.0:
a:首先 frameworks/base/telephony/java/android/telephony/SignalStrength.java
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();
try{
level = mServiceStateExt.mapGsmSignalLevel(asu);//主要的函数在这里
} catch (Exception e){
if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
else if (asu >= 16) level = SIGNAL_STRENGTH_HIGHEST; //具体的转换关系 asu=(-113+assi)/2
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;
}
return level;
}
b:mServiceStateExt 的具体实例在 mediatek/frameworks/base/op/java/com/mediatek/op/telephony/ServiceStateExt.java
修改: mapGsmSignalLevel(int asu){...}
c:上层的修改主要在SystemUI模块
主要文件有:networkcontroller.java networkcontrollergemini.java 这里只需修改 判断条件就ok了 主要的原始的为if(iconlevel<5)-->if(iconlevel<6)
telephonyicons.java telephonyiconsgemini.java 大家只需打开文件 就明白要修改哪了(主要修改资源文件id数组,由原来的length为五 改为6)
android 2.3:
a. modem底层上报信号参数RSSI给modem L4
b. 在modem L4中,经过计算的到上报给上层的asu值,asu的范围是0-31,计算公式为:
asu = (-113 + RSSI) / 2
c. 在SatusBarPolicy.java中的updateSignalStrength(int simId)方法中(单卡情况为updateSignalStrength()),将asu值转化为信号格数,将asu的取值范围对应相应iconlevel就ok了
2.3就不做详细描述了 ,具体修改参考android 4. 0
android 4.0:
a:首先 frameworks/base/telephony/java/android/telephony/SignalStrength.java
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();
try{
level = mServiceStateExt.mapGsmSignalLevel(asu);//主要的函数在这里
} catch (Exception e){
if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
else if (asu >= 16) level = SIGNAL_STRENGTH_HIGHEST; //具体的转换关系 asu=(-113+assi)/2
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;
}
return level;
}
b:mServiceStateExt 的具体实例在 mediatek/frameworks/base/op/java/com/mediatek/op/telephony/ServiceStateExt.java
修改: mapGsmSignalLevel(int asu){...}
c:上层的修改主要在SystemUI模块
主要文件有:networkcontroller.java networkcontrollergemini.java 这里只需修改 判断条件就ok了 主要的原始的为if(iconlevel<5)-->if(iconlevel<6)
telephonyicons.java telephonyiconsgemini.java 大家只需打开文件 就明白要修改哪了(主要修改资源文件id数组,由原来的length为五 改为6)
到此 就完成了~~~
http://www.eoeandroid.com/thread-321378-1-1.html