Android系統開發之修改Captive Potal Service(消滅感嘆號)

本文原做者 長鳴鳥 ,未經贊成,轉載不帶名的嚴重鄙視。
谷歌在Android5.0以後的版本加入了CaptivePotalLogin服務。本服務的功能是檢查網絡鏈接互聯網狀況,主要針對於Wi-Fi,不讓Android設備自動鏈接那些不能聯網的無線熱點,白白耗電。
該服務的原理就是讓接入無線熱點後,測一下網站connectivitycheck.gstatic.com的聯通狀況。
但對於不能訪問谷歌服務器的地區,問題就來了:java

  1. 若是谷歌(谷歌服務)認爲WiFi網絡沒法聯網,就不會自動鏈接到該WiFi熱點。並且若是設備有移動網絡可用,就會自動切換到2G/3G/LTE。而且讓WiFi網絡的標誌上面顯示感嘆號標誌。android

  2. 出現感嘆號的同時,該服務會一直試探服務器,直到聯通爲止。該過程會消耗流量和電量,甚至致使部分設備沒法休眠。shell

  3. 這個感嘆號會使廣大強迫症晚期患者沒法接受。服務器

對於Android Source開發的同窗,最好的解決辦法天然是修改源碼:
方案1:更換測試地址
frameworks/base/packages/SettingsProvider/res/values/defaults.xml:網絡

@@ -223,7 +223,7 @@
 <!-- Default for Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED,
          1 == enabled, all other values will disable it -->
     <integer name="def_captive_portal_detection_enable">0</integer>
+    <string name="def_captive_portal_server">www.androidbak.net</string>

frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java:ide

@@ -2623,9 +2623,12 @@ class DatabaseHelper extends SQLiteOpenHelper {
             loadBooleanSetting(stmt, Settings.Global.ASSISTED_GPS_ENABLED,
                     R.bool.assisted_gps_enabled);
 
           loadIntegerSetting(stmt, Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED,
                     R.integer.def_captive_portal_detection_enable);
 
+            loadStringSetting(stmt, Settings.Global.CAPTIVE_PORTAL_SERVER,
+                    R.string.def_captive_portal_server);
+

方案2:禁用服務
本文原做者 長鳴鳥 ,未經贊成,轉載不帶名的嚴重鄙視。測試

--- a/frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+++ b/frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java
@@ -270,8 +270,11 @@ public class NetworkMonitor extends StateMachine {
 
         mLingerDelayMs = SystemProperties.getInt(LINGER_DELAY_PROPERTY, DEFAULT_LINGER_DELAY_MS);
 
-        mIsCaptivePortalCheckEnabled = Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 1) == 1;
+        //mIsCaptivePortalCheckEnabled = Settings.Global.getInt(mContext.getContentResolver(),
+               //Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 1) == 1;
+        mIsCaptivePortalCheckEnabled = false;

對於普通用戶,有一個簡便的方法:
第一步:安裝adb,很少贅述。
第二步:在終端輸入adb shell settings put global captive_portal_server www.g.cn
或者輸入adb shell settings put global captive_portal_detection_enabled 0
重啓有效,恢復出廠設置要重來。
本文原做者 長鳴鳥 ,未經贊成,轉載不帶名的嚴重鄙視。
That’s all.網站

相關文章
相關標籤/搜索