android 5.1 WIFI圖標上的感嘆號及其解決辦法


轉自: http://blog.csdn.net/w6980112/article/details/45843129

 

  第一次調試android5.1的 WIFI更改小功能

Wifi 源碼的相關路徑目錄 
packages/apps/Settings/src/com/Android/settings/wifi/ 
frameworks/base/wifi/java/android/net/wifi/ 
frameworks/base/services/core/java/com/android/server/connectivity 
frameworks/opt/net/wifi/service/java/com/android/server/wifi/ 
frameworks/base/core/

定位一方面根據屏幕的顯示信息,另一方面看logcat捕捉的信息,從中會找到有用的。Logcat會告訴你一些蛛絲馬跡。還有就是相關代碼分布目錄。會用百度谷歌搜索信息,android5.1 wifi、 
wifi_no_internet、No Internet Access Detected, won\’t automatically reconnect……………

1、Framework層加打印信息首先聲明頭文件import android.util.Log;以及TAG是否有。 
在加打印信息時,注意上下位置,例如不能在return XX 下面,以及注意變量的名稱會變化,對象會變。numNoInternetAccessRepor或者XXX.umNoInternetAccessReports 
只能重編嗎? 
2、packages/apps/Settings/res/ 下是屏幕顯示的字符串信息資源, 
No Internet Access Detected, won\’t automatically reconnect. 可以在 
packages/apps/Settings/src 下搜索Wifi_no_internet 字符串。在哪里打印的出 summary.append(context.getString(R.string.wifi_no_internet)); 
else if (mConfig != null && mConfig.hasNoInternetAccess()) 
再跟蹤mConfig.hasNoInternetAccess() 函數, 
public boolean hasNoInternetAccess() { 
Return numNoInternetAccessReports > 0 && !validatedInternetAccess; 

再跟蹤numNoInternetAccessReports,在這點,分了多個方向,需要分析語法,最有可能走那一塊。 
執行命令 grep numNoInternetAccessReports -rn ./frameworks/ 
目標在路徑如下所示:frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java +7648 
需要研究這個函數public boolean processMessage(Message message) {} 
查找這個函數 networkStatus()的調用之處。 
在frameworks/base/core/java/android/net/NetworkAgent.java +194 case CMD_REPORT_NETWORK_STATUS: { 
if (VDBG) { 
log(“CMD_REPORT_NETWORK_STATUS(” + 
(msg.arg1 == VALID_NETWORK ? “VALID)” : “INVALID)”)); 

networkStatus(msg.arg1); 
接着跟蹤MD_REPORT_NETWORK_STATUS 在 
frameworks/base/services/core/java/com/android/server/ConnectivityService.java +1988 
接着跟蹤 case NetworkMonitor.EVENT_NETWORK_TESTED在 
frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java +360 
查找這個類private class OfflineState extends State 
private final State mOfflineState = new OfflineState()

再查找mOfflineState在 
frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java +487 
研究transitionTo(mOfflineState) 這個函數 
根本原因是由於isCaptivePortal()這個函數,定義之處路徑在 
frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java +635 
查閱資料是去嘗試訪問android的一個網址,根據http返回來的值來判斷網絡是否連接通,其中返回為204時為正常,但由於國內屏蔽了這個網址,故在中國這個功能不適用,所以wifi信號有嘆號這個標志。

解決辦法是if (!mIsCaptivePortalCheckEnabled) return 204 讓這句成立,跟蹤代碼 調用之處在 
mIsCaptivePortalCheckEnabled = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 1) == 1; 
跟蹤Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED 
路徑在 
android-5.1-m200-mr1/frameworks/base/core/java/android/provider/Settings.java +6175 
根據提示說明把上面的宏改成0即可關掉這個功能。我們遵循不改動android源碼的原則,不直接改動, 
在/frameworks/base/packages/SettingsProvider/res/values/defaults.xml 中添加這樣一句話 
1

在frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +2648 
添加loadIntegerSetting(stmt, Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, R.integer.def_captive_portal_detection_enabled); 
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java 這個文件是用來生成setting.db的。

frameworks/base/packages/SettingsProvider/res/values/defaults.xml 
一般把setting.db中各個表的出廠默認初始值放在這個文件中,在DatabaseHelper.java 中讀取。

接着在自己廠商的設備配置文件中添加device/ingenic/dorado/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml

在這里面可以重新給宏初始化為0這個值,在編譯時先編譯android源碼,之后再編譯到這邊,這樣可以把之前的給覆蓋掉,以后在看代碼時能清楚地之道android默認配置是打開的為1。 
0

 
 
root模式可以手動更改,命令如下:
adb shell settings put global captive_portal_detection_enabled 0
 
相關資源位置:
static final int[][] WIFI_SIGNAL_STRENGTH = {
{ R.drawable.stat_sys_wifi_signal_0,
R.drawable.stat_sys_wifi_signal_1,
R.drawable.stat_sys_wifi_signal_2,
R.drawable.stat_sys_wifi_signal_3,
R.drawable.stat_sys_wifi_signal_4 },
{ R.drawable.stat_sys_wifi_signal_0_fully,
R.drawable.stat_sys_wifi_signal_1_fully,
R.drawable.stat_sys_wifi_signal_2_fully,
R.drawable.stat_sys_wifi_signal_3_fully,
R.drawable.stat_sys_wifi_signal_4_fully }
};
R.drawable.stat_sys_wifi_signal_0帶感嘆號
R.drawable.stat_sys_wifi_signal_0_fully不帶感嘆號
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM