• 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不带感叹号
     
     
     
  • 相关阅读:
    利用Jquery实现http长连接(LongPoll)
    使用C#把发表的时间改为几年前,几个月,几天前,几小时前,几分钟前,或几秒前
    跨域调用接口——WebClient通过get和post请求api
    Url重写——伪静态实现
    控制反转(IOC)
    文件上传之——用SWF插件实现文件异步上传和头像截取
    利用枚举展示下拉列表
    时间格式转换—将后台返回的/Date(1448954018000)/格式转换为正常的时间格式
    @RenderSection,@RenderPage,@RenderBody介绍
    简单工厂模式(转)
  • 原文地址:https://www.cnblogs.com/dirt2/p/5918115.html
Copyright © 2020-2023  润新知