android 4.0 "移动网络" 选项 不存在

关键词:android 4.0 移动网络 Mobile networks
平台信息:
内核:linux2.6/linux3.0
系统:android/android4.0
平台:S5PV310(samsung exynos4210)

作者:xubin341719(欢迎转载,请注明作者)

前几天调试3G模块,最后发现我拿到的BSP,在“设置”中没有关于3G的选项,状态栏也没有显示3G状态的图标,如下图所示,这个可好,把3G的驱动加入,进程也起来了,就是不知道怎么连接。最可恶的就是在网上看到一哥们也遇到相同的问题,他发贴子求帮助,最后问题解决了,结贴时写一个“问题解决,结贴”,问他怎么搞的,他也没回,有点不“厚道”呀,嘿嘿!还是自己找吧……

1、“Mobile networks”字符串定义

我们想要的数据没有显示,从不显示的字符找起,顺藤摸瓜吧,这些对我们这些做驱动的有点难度。“Mobile networks”不显示,那我们就从最开始跟下代码吧。

4.0.3_r1/packages/apps/Settings/res/values/String.xml
  <!-- Wireless controls, item title to go into the network settings --> 
  <string name="network_settings_title">Mobile networks</string>

2、network_settings_title引用

4.0.3_r1/packages/apps/Settings/src/com/android/settings/WirelessSettings.java中找到:"mobile_network_settings"
  private static final String KEY_MOBILE_NETWORK_SETTINGS = "mobile_network_settings"; 

network_settings_title赋值给 KEY_MOBILE_NETWORK_SETTINGS,再跟进一下 KEY_MOBILE_NETWORK_SETTINGS这个变量吧。

在相同的文件中我们找到:

 // Remove Mobile Network Settings if it's a wifi-only device. 
  if (Utils.isWifiOnly(getActivity())) { 
  getPreferenceScreen().removePreference(findPreference(KEY_MOBILE_NETWORK_SETTINGS)); 
  } 

getSystemService(Context.CONNECTIVITY_SERVICE);获得网络连接服务,然后判断是否支持TYPE_MOBILE,现在判断应该是不支持,也就是if判断中:Utils.isWifiOnly(getActivity())=1

所以把移动网络的选项移除,现在我们就重点去分析Utils.isWifiOnly(getActivity()),找到不显示的原因,也就是if()中的判断条件,跟进这段代码。

3、我们去看下ifWifiOnly()是何方神圣?

4.0.3_r1/packages/apps/Settings/src/com/android/settings/Utils.java中找到

import android.net.ConnectivityManager;
 
public static boolean isWifiOnly(Context context) {
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(
Context.CONNECTIVITY_SERVICE);
return (cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE) == false);
}

Utils.isWifiOnly(getActivity())=1也就是

cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE) = false,可是我们现在要的值是true,为什么会出现false呢,我们继续往下看cm.isNetworkSupported

4、 再分析isNetworkSupported

android.net.ConnectivityManager;找到

4.0.3_r1/frameworks/base/core/java/android/net/ ConnectivityManager.java

isNetworkSupported的实现如下:

public boolean isNetworkSupported(int networkType) {
try {
return mService.isNetworkSupported(networkType);
} catch (RemoteException e) {}
return false;
}
}


继续跟进 mService.isNetworkSupported这个函数的实现

5、 mService.isNetworkSupported的实现

4.0.3_r1/frameworks/base/services/java/com/android/server/ ConnectivityManager.java

  @Override 
  public boolean isNetworkSupported(int networkType) { 
  enforceAccessPermission(); 
loge("xu_bin"+"test typevalid = " + isNetworkTypeValid(networkType) + " trackers = " + (mNetTrackers[networkType] != null)); 
  return (isNetworkTypeValid(networkType) && (mNetTrackers[networkType] != null)); 
  }

有两个参数: isNetworkTypeValid(networkType) (mNetTrackers[networkType] != null))

我们要的值是ture,可返回是false,看下这两个值是什么,把这连个值打印出来:

loge("xu_bin"+"test typevalid = " + isNetworkTypeValid(networkType) + " trackers = " + (mNetTrackers[networkType] != null));

打印结果为:

打印结果为:

E/ConnectivityService( 1426): xu_bin test typevalid = true trackers = false

 

也就是说:(mNetTrackers[networkType] != null)这个地方出问题;

即mNetTrackers[networkType] ==null

6、我们在看下:mNetTrackers[networkType]的由来吧

其实下面这段代码我有点蒙,连猜带蒙的,

4.0.3_r1/frameworks/base/services/java/com/android/server/ ConnectivityManager.java

public ConnectivityService(Context context, INetworkManagementService netd,
  INetworkStatsService statsService, INetworkPolicyManager policyManager)
{
  if (DBG) log("ConnectivityService starting up");
           …………
  // Load device network attributes from resources
  String[] raStrings = context.getResources().getStringArray(
  com.android.internal.R.array.radioAttributes);
  for (String raString : raStrings) {
          loge("xu_bin test raStrings" + raStrings); // 1
          loge("xu_bin test raString" + raString);
  RadioAttributes r = new RadioAttributes(raString);
  if (r.mType > ConnectivityManager.MAX_RADIO_TYPE) {
  loge("Error in radioAttributes - ignoring attempt to define type " + r.mType);
  continue;
  }
  if (mRadioAttributes[r.mType] != null) {
  loge("Error in radioAttributes - ignoring attempt to redefine type " +
  r.mType);
  continue;
  }
  mRadioAttributes[r.mType] = r;
  }
 
  String[] naStrings = context.getResources().getStringArray(
  com.android.internal.R.array.networkAttributes);
 
  for (String naString : naStrings) {
          loge("xu_bin test naStrings" + naStrings);//2
          loge("xu_bin test naString" + naString);
  try {
  NetworkConfig n = new NetworkConfig(naString);
  if (n.type > ConnectivityManager.MAX_NETWORK_TYPE) {
  loge("Error in networkAttributes - ignoring attempt to define type " +
  n.type);
  continue;
  }
  if (mNetConfigs[n.type] != null) {
  loge("Error in networkAttributes - ignoring attempt to redefine type " +
  n.type);
  continue;
  }
  …………
  /*
  * Create the network state trackers for Wi-Fi and mobile
  * data. Maybe this could be done with a factory class,
  * but it's not clear that it's worth it, given that
  * the number of different network types is not going
  * to change very often.
  */
  for (int netType : mPriorityList) {
loge("xu_bin:" + netType + " " + mNetConfigs[netType].radio + " " + ConnectivityManager.TYPE_MOBILE);
loge("xu_bin test mNetConfigs[netType].radio =" + (mNetConfigs[netType].radio));//3
  switch (mNetConfigs[netType].radio) { 
 
                      …………
  case ConnectivityManager.TYPE_MOBILE:
  mNetTrackers[netType] = new MobileDataStateTracker(netType,
  mNetConfigs[netType].name);
  mNetTrackers[netType].startMonitoring(context, mHandler);
  break;
  case ConnectivityManager.TYPE_DUMMY:
  mNetTrackers[netType] = new DummyDataStateTracker(netType,
  mNetConfigs[netType].name);
  mNetTrackers[netType].startMonitoring(context, mHandler);
  break;
                      …………
  case ConnectivityManager.TYPE_ETHERNET:
  mNetTrackers[netType] = EthernetDataTracker.getInstance();
  mNetTrackers[netType].startMonitoring(context, mHandler);
  break;
  default:
  loge("Trying to create a DataStateTracker for an unknown radio type " +
  mNetConfigs[netType].radio);
  continue;
  }
  mCurrentLinkProperties[netType] = null;
  if (mNetTrackers[netType] != null && mNetConfigs[netType].isDefault()) {
  mNetTrackers[netType].reconnect();
  }
  }
 
  …………
  }

加入打印信息:

1)、

loge("xu_bin test raStrings" + raStrings);

loge("xu_bin test raString" + raString);

2)、

loge("xu_bin test naStrings" + naStrings);

loge("xu_bin test naString" + naString);

3)、

loge("xu_bin:" + netType + " " + mNetConfigs[netType].radio + " " + ConnectivityManager.TYPE_MOBILE);

loge("xu_bin test mNetConfigs[netType].radio =" + (mNetConfigs[netType].radio));

打印出来的值如下:
E/ConnectivityService( 1426): xu_bin test raString s[Ljava.lang.String;@411cf008 
E/ConnectivityService( 1426): xu_bin test raString 9,1 
E/ConnectivityService( 1426): xu_bin test naString s[Ljava.lang.String;@410e30c8 
E/ConnectivityService( 1426): xu_bin test naString ethernet,9,9,1,-1,true 
E/ConnectivityService( 1426): xu_bin:9 9 0 
E/ConnectivityService( 1426): xu_bin test mNetConfigs[netType].radio =9 
D/NetworkManagementService( 1426): Registering observer 
D/NetworkManagementService( 1426): Registering observer 
D/NetworkManagementService( 1426): Registering observer 
I/WifiService( 1426): WifiService starting up with Wi-Fi disabled 
E/ConnectivityService( 1426): xu_bintest typevalid = true trackers = false
com.android.internal.R.array.networkAttributes的值在:
    
    

我们在:4.0.3_r1/frameworks/base/core/res/res/values/config.xml

<string-array translatable="false" name="networkAttributes"> 
  <item>"wifi,1,1,1,-1,true"</item> 
  <item>"mobile,0,0,0,-1,true"</item> 
  <item>"mobile_mms,2,0,2,60000,true"</item> 
  <item>"mobile_supl,3,0,2,60000,true"</item> 
  <item>"mobile_hipri,5,0,3,60000,true"</item> 
  <item>"mobile_fota,10,0,2,60000,true"</item> 
  <item>"mobile_ims,11,0,2,60000,true"</item> 
  <item>"mobile_cbs,12,0,2,60000,true"</item> 
  <item>"wifi_p2p,13,1,0,-1,true"</item> 
  </string-array>

这里面并没有:ethernet,9,9,1,-1,true ,所以我们全局搜索一下:

grep -r -w ethernet ./*得到下面有用信息:

./android-samsung-dev.patch:- <item>"ethernet,9,9,2,-1,true"</item> 
./android-samsung-dev.patch:+           // Following code will forcefully allow ethernet network as usable required for v310/c210. 
./packages/providers/DownloadProvider/src/com/android/providers/downloads/DownloadThread.java:          // Following code will forcefully allow ethernet network as usable required for v310/c210. 
./device/samsung/smdkv310/overlay/frameworks/base/core/res/res/values/config.xml: <item>"ethernet,9,9,1,-1,true"</item>
 

对比代码发现:

./packages/providers/DownloadProvider/src/com/android/providers/downloads/DownloadThread.java中删除

   Following code will forcefully allow ethernet network as usable required for v310/c210. 
  if (networkUsable != DownloadInfo.NETWORK_OK) { 
  Log.i(Constants.TAG, " Forcing ethernet connection usable for download to work!!!"); 
            networkUsable = DownloadInfo.NETWORK_OK; 
          }

4.0.3_r1/device/samsung/smdkv310/overlay/frameworks/base/core/res/res/values/config.xml中删除:

  <!-- This string array should be overridden by the device to present a list of network 
  attributes. This is used by the connectivity manager to decide which networks can coexist 
  based on the hardware --> 
  <!-- An Array of "[Connection name],[ConnectivityManager connection type], 
  [associated radio-type],[priority],[restoral-timer(ms)],[dependencyMet] --> 
  <!-- the 5th element "resore-time" indicates the number of milliseconds to delay 
  before automatically restore the default connection. Set -1 if the connection 
  does not require auto-restore. --> 
  <!-- the 6th element indicates boot-time dependency-met value. --> 
  <string-array translatable="false" name="networkAttributes"> 
  <item>"ethernet,9,9,1,-1,true"</item> 
  </string-array> 
  
  <!-- This string array should be overridden by the device to present a list of radio 
  attributes. This is used by the connectivity manager to decide which networks can coexist 
  based on the hardware --> 
  <!-- An Array of "[ConnectivityManager connectionType], 
  [# simultaneous connection types]" --> 
  <string-array translatable="false" name="radioAttributes"> 
  <item>"9,1"</item> 
  </string-array>


把上面两部分删除就可以了。其实真正的值是在4.0.3_r1/frameworks/base/core/res/res/values/config.xml中,通过上面函数解析。

正常情况下打印值为:如:wifi mobile mobile_mms mobile_supl等都是在config.xml中配置的

D/ConnectivityService( 1397): ConnectivityService starting up
E/ConnectivityService( 1397): xu_bin test restring s[Ljava.lang.String;@41240e38
E/ConnectivityService( 1397): xu_bin test restring 1,1
E/ConnectivityService( 1397): xu_bin test restring s[Ljava.lang.String;@41240e38
E/ConnectivityService( 1397): xu_bin test restring 0,1
E/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880
E/ConnectivityService( 1397): xu_bin test naString wifi,1,1,1,-1,true
E/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880
E/ConnectivityService( 1397): xu_bin test naString mobile,0,0,0,-1,true
E/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880
E/ConnectivityService( 1397): xu_bin test naString mobile_mms,2,0,2,60000,true
E/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880
E/ConnectivityService( 1397): xu_bin test naString mobile_supl,3,0,2,60000,true
E/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880
E/ConnectivityService( 1397): xu_bin test naString mobile_hipri,5,0,3,60000,true
E/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880
E/ConnectivityService( 1397): xu_bin test naString mobile_fota,10,0,2,60000,true
E/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880
E/ConnectivityService( 1397): xu_bin test naString mobile_ims,11,0,2,60000,true
E/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880
E/ConnectivityService( 1397): xu_bin test naString mobile_cbs,12,0,2,60000,true
E/ConnectivityService( 1397): xu_bin test naString s[Ljava.lang.String;@41241880
E/ConnectivityService( 1397): xu_bin test naString wifi_p2p,13,1,0,-1,true

下面就可以看到“移动网络”了:


 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
依托Android最新的主流平台为Android4.0,面向最新的SDK和相关工具,同时还涵盖了老版平台中的一些常用功能,以帮助开发人员适应目前市面上所有的主流设备。《Android移动应用开发(第3版)卷Ⅰ:基础篇》涵盖了作者数年来在移动开发领域所积累的经验,以及成功进行移动项目开发所需的全部概念和实用技术,包括移动开发过程与传统软件开发的区别,还包括帮助你节约宝贵时间和规避隐患的技巧。不管你的项目有多大规模,《Android移动应用开发(第3版)卷Ⅰ:基础篇》都能为你提供帮助。 内容推荐   《Android移动应用开发(第3版)卷Ⅰ:基础篇》涵盖了Android开发从概念、技术到市场推广应用的全部主题,内容包括Android平台概览、Android应用程序设计精髓、Android用户界面设计精髓、Android应用程序设计精髓、对外发布你的Android应用程序和附录6个部分。附录还包含了Android开发常用工具(模拟器、DDMS和Eclipse)的使用指南。   《Android移动应用开发(第3版)卷Ⅰ:基础篇》卷Ⅰ以及本书的卷Ⅱ,不仅适合Android应用程序开发人员阅读,还能为QA测试人员提供指导。另外,本书还可以帮助项目经理更好地管理项目进程和项目团队,帮助市场推广人员更好地把握市场,创造令人瞩目的销售业绩。 作者简介 Lauren Darcey LaurenDarcey是一家专注于移动开发的软件公司的技术主管,所涉及的技术包括Android、iPhone、Blackberry、PalmPre、BREW和J2ME,还包括咨询服务。拥有20年专业软件产品研发经验的Lauren被公认为企业架构和商业级移动应用开发的权威。Lauren获得了加州大学圣克鲁兹分校授予的计算机科学专业学士学位。Shane Conder ShaneConder拥有丰富的开发经验,在过去的10年中,他把主要精力集中在移动和嵌入式开发领域,迄今已设计并开发了基于Android、iPhone、BREW、Blackberry、J2ME、Palm和WindowsMobile的诸多商业软件。Shane撰写了大量关于移动通信行业和评估移动开发平台的文章,这些文章发表在他的个人技术博客上,在业界受到了广泛的关注。Shane获得了加州大学授予的计算机科学专业学士学位。 目录 第一部分 Android平台概览 第1章 Android简介  第一部分 Android平台概览 第1章 Android简介  第2章 搭建你的Android开发环境  第3章 编写第一个Android应用程序  第4章 掌握Android开发工具  第二部分 Android应用程序设计基础 第5章 剖析Android应用程序  第6章 使用Android Manifest文件定义应用程序  第7章 管理应用程序资源  第三部分 Android用户界面设计精髓 第8章 探索用户界面屏幕元素  第9章 使用布局设计用户界面  第10章 使用Fragment  第11章 使用对话框  第四部分 Android应用程序设计精髓 第12章 使用Android选项  第13章 使用文件和目录  第14章 使用内容提供器  第15章 设计高兼容性应用程序  第五部分 对外发布你的Android应用程序 第16章 移动软件开发过程  第17章 设计和开发"防弹"Android应用程序  第18章 测试Android应用程序  第19章 发布你的Android应用程序  第六部分 附录 附录A Android模拟器快速入门  A.1 模拟器的目的:虚拟现实  A.2 使用Android虚拟设备(AVD)  A.2.1 使用Android SDK和AVD管理器  A.2.2 创建AVD  A.3 使用指定AVD启动模拟器  A.3.1 维持模拟器高效运行  A.3.2 配置模拟器启动项  A.3.3 启动模拟器运行应用程序  A.3.4 从Android SDK和AVD管理器中启动模拟器  A.4 配置模拟器的GPS位置信息  A.5 在两个模拟器实例之间拨打电话  A.6 在两个模拟器实例之间发送消息  A.7 通过控制台与模拟器交互  A.7.1 使用控制台模拟来电  A.7.2 使用控制台模拟短消息  A.7.3 使用控制台发送GPS坐标  A.7.4 使用控制台监视网络状态  A.7.5 使用控制台操作电源设置  A.7.6 使用其他控制台命令  A.8 享受模拟器  A.9 认识模拟器的局限  参考资料和更多信息  附录B Android DDMS快速入门  B

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值