`
quanminchaoren
  • 浏览: 926472 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

android 浏览器APN切换

阅读更多

业务需求:有些链接需要使用CMWAP 接入点才能成功访问, 我们的浏览器必须能够自动切换 CNNET, CMWAP. 
分析:调用浏览器的时候在Intent 中传递一个参数, 用于标示接入点需要。 我们的浏览器需要处理 3 种情况, 第一是参数为 cmwap 时, 切换成 cmwap ; 第二是参数为 cmnet 或者从桌面上的浏览器图标点击, 第一次启动浏览器时, 切换成 cmnet;  第三是打开一个链接, 没有参数时, 不做切换, 直接使用当前接入点。 如果已经打开浏览器, 并且切换成 cmwap , 无论后来如何去手动设置接入点, 当点击浏览器里面的链接, 或者输入其他地址进行访问时, 必须能够再次切换成 wap.  已经打开为 cmnet 浏览器同理。 在需要切换的时候, 必须等到切换完成, 新的接入点成功连接上以后才能开始数据的载入。 
改动: 1.  接入点切换方法 
/* 
* change current network connection to cmwap if it's not. added by Qkf36923 
*/ 
public int forceAPNConnection(String apnName) { 
//validate apn name. 
if (apnName == null || apnName.equals("") || 
(!("cmwap".equals(apnName)||"cmnet".equals(apnName)))) { 
return 0; 


NetworkInfo info = conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
if (!info.isAvailable()) { 
return 0; 


info = conManager.getActiveNetworkInfo(); 
String tempAPN = info == null ? "" : info.getExtraInfo(); 
//if current apn is not cmwap, we have to switch to cmwap. 
if (!apnName.equals(tempAPN)) { 
if (mNChangeReceiver != null) { 
this.unregisterReceiver(mNChangeReceiver); 

mNChangeReceiver = new NetworkChangeReceiver(); 
//register receiver for wap network connection. 
IntentFilter upIntentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); 
registerReceiver(mNChangeReceiver, upIntentFilter); 
updateCurrentAPN(getContentResolver(), apnName); 

return 1; 

return 0; 

onCreate onNewIntent 的方法中去判断是否需要切换, 以及设置一些标示。 
public void onCreate(Bundle icicle) { 
… 
if (!mTabControl.restoreState(icicle)) { 
// clear up the thumbnail directory if we can't restore the state as 
// none of the files in the directory are referenced any more. 
new ClearThumbnails().execute( 
mTabControl.getThumbnailDir().listFiles()); 
// there is no quit on Android. But if we can't restore the state, 
// we can treat it as a new Browser, remove the old session cookies. 
CookieManager.getInstance().removeSessionCookie(); 
final Intent intent = getIntent(); 
final Bundle extra = intent.getExtras(); 
// Create an initial tab. 
// If the intent is ACTION_VIEW and data is not null, the Browser is 
// invoked to view the content by another application. In this case, 
// the tab will be close when exit. 
UrlData urlData = getUrlDataFromIntent(intent, null); 
/* 
* when request connection is specified to cmwap, we have to change current APN 
* added by Qkf36923, 20110113 
*/ 
String requestConType = intent.getStringExtra("data_connection"); 
if (requestConType == null) { 
//if launched from launcher, it's treated as WWW browser 
if (intent.getAction().equals(Intent.ACTION_MAIN)) { 
dataConnectionType = "cmnet"; 
} else { 
//get current APN type and set it to browser 
if (info != null) { 
String tempAPN = info.getExtraInfo(); 
dataConnectionType = tempAPN; 


if (forceAPNConnection(dataConnectionType) == 1) { 
isSwitchingToNet = true; 

} else if ("cmwap".equals(requestConType) 
&& info != null && (!"cmwap".equals(info.getExtraInfo()))) { 
dataConnectionType = "cmwap"; 
if (forceAPNConnection(dataConnectionType) == 1) { 
isSwitchingToWap = true; 


下面会去调用loadUrl loadDataIn 方法, 需要做相应修改: 
private void loadUrl(WebView view, String url) { 
updateTitleBarForNewLoad(view, url); 

/**if url is navigation page, we can load it from local directly. 
* Added by QuYueting 20110310. Start. 
*/ 
if (mNChangeReceiver != null) { 
if (BrowserSettings.NAVIGATION_PAGE_URL.equals(url) 
|| (url != null && url.startsWith("about:"))) { 
autoLoad = true; 
view.loadUrl(url); 
} else { 
autoLoad = false; 
mWebView = view; 
tempUrl = url; 

} else { 
view.loadUrl(url); 

/**Added by QuYueting 20110310. End**/ 

LoadUrlDataIn方法同时也会被 onNewIntent 调用。 
private void loadUrlDataIn(Tab t, UrlData data) { 
//if it's not called from OnCreate and it's switching to wap, postpone data loading. added by Qkf36923 
updateTitleBarForNewLoad(t.getWebView(), data.mUrl); 

/**if no need to switch or home page is set as empty, we should load navigation page instantly. 
* Added by QuYueting 20110310. Start**/ 
if (mNChangeReceiver == null || 
(data.isEmpty() && mSettings.getHomePage().equals("")) 
|| (BrowserSettings.NAVIGATION_PAGE_URL.equals(data.mUrl)) 
|| (data.mUrl != null && data.mUrl.startsWith("about:"))) { 
data.loadIn(t); 
} else { 
mt = t; 
mUrlData = data; 

/**if no need to switch or home page is set as empty, we should load navigation page instantly. 
* Added by QuYueting 20110310. End**/ 


再看对OnNewIntent 的修改 
protected void onNewIntent(Intent intent) { 
… 
UrlData urlData = getUrlDataFromIntent(intent, current); 

//get request connection type, if current connection type is cmwap, it indicates 
//this is monternet browser, we won't change APN any more. 
String requestConType = intent.getStringExtra("data_connection"); 
if (requestConType == null) { 
//get current APN, set browser connection type. 
NetworkInfo network = conManager.getActiveNetworkInfo(); 
if (network != null && network.isAvailable()) { 
dataConnectionType = network.getExtraInfo(); 

} else if ("cmwap".equals(requestConType) || "cmnet".equals(requestConType)){ 
dataConnectionType = requestConType; 
if (forceAPNConnection(dataConnectionType) == 1) { 
if ("cmwap".equals(requestConType)) { 
isSwitchingToWap = true; 

if ("cmnet".equals(requestConType)) { 
isSwitchingToNet = true; 



fromNewIntent = true; 

fromNewIntent用来标志是否是第一次创建浏览器, 这在连接上目标 APN 网络以后如何打开页面有关系。 
下面是NetworkChangeReceiver 的定义 
/* 
* receiver for observing network connection change, added by Qkf36923 
*/ 
public class NetworkChangeReceiver extends BroadcastReceiver { 

public void onReceive(Context context, Intent intent) { 
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { 
//NetworkInfo info = conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
NetworkInfo info = intent.getParcelableExtra( 
ConnectivityManager.EXTRA_NETWORK_INFO); 
String apn = info.getExtraInfo(); 

if (((isSwitchingToWap && "cmwap".equals(apn)) 
|| (isSwitchingToNet && "cmnet".equals(apn))) 
&& info.isConnected() && info.isAvailable()) { 
/* 
* apn change message is sent out more than once during a second, but it 
* only happens once practically. 
*/ 
if(mNChangeReceiver != null) { 
WebView.disablePlatformNotifications(); 
WebView.enablePlatformNotifications(); 
if (fromNewIntent) { 
loadUrlOnNewIntent(); 
} else { 
if (!autoLoad) { 
loadUrlOnCreate(); 
autoLoad = true; 



BrowserActivity.this.unregisterReceiver(mNChangeReceiver); 
mNChangeReceiver = null; 

Message message = connectionHandler.obtainMessage(0); 
connectionHandler.sendMessageDelayed(message, 300); 






//load data when on Create. added by Qkf36923 
private void loadUrlOnCreate() { 
if (mUrlData.isEmpty()) { 
if (mWebView != null) { 
mWebView.loadUrl(tempUrl); 
mWebView = null; 

} else { 
if (mUrlData != null) { 
mUrlData.loadIn(mt); 
mUrlData = null; 



private void loadUrlOnNewIntent() { 
//updateTitleBarForNewLoad(mt.getWebView(), mUrlData.mUrl); 
mUrlData.loadIn(mt); 

//new handler for setting wap switching flag. added by Qkf36923 
Handler connectionHandler = new Handler() { 
public void handleMessage(Message msg) { 
super.handleMessage(msg); 
if (receivedByStateListener) { 
receivedByStateListener = false; 
resetSwitchingFlag(); 
} else { 
Message message = connectionHandler.obtainMessage(0); 
connectionHandler.sendMessageDelayed(message, 300); 



}; 
connectionHandler用于发送消息重置 isSwitchingToWap isSwitchingToNet 标志。 因为本来浏览器中有一个网络监听器, 用于弹出网络是否存在的提示框。 我们进行接入点切换时网络会先断掉, 会被那个监听器收到, 从而弹出网络不存在的提示框, 这样用户体验不好,我们需要在切换的时候屏蔽掉。 所以做了以下修改: 
mNetworkStateIntentReceiver = new BroadcastReceiver() { 
@Override 
public void onReceive(Context context, Intent intent) { 
if (intent.getAction().equals( 
ConnectivityManager.CONNECTIVITY_ACTION)) {… 

if (!isSwitchingToWap && !isSwitchingToNet) { 
onNetworkToggle(info.isAvailable()); 
} else { 

这样当网络连接成功后, 我们需要把标志再重置回去。

分享到:
评论

相关推荐

    android apn切换程序

    "Android APN切换程序"是一个专门针对Android系统的应用,它允许用户方便快捷地在不同的APN设置之间切换,无需手动进入系统设置进行复杂的配置。这个程序特别适用于那些需要频繁更改APN设置的用户,例如移动网络调试...

    android手机APN设置

    Android 手机 APN 设置 APN(Access Point Name)是移动网络中的一个重要概念,它是指移动网络中的一个访问点名称,用于标识移动网络中的一个访问点。Android 手机中的 APN 设置是指在 Android 手机中设置移动网络...

    Android端APN实现module

    在Android系统中,APN(Access Point Name)是用于设置移动数据网络连接的关键参数,它定义了设备如何连接到互联网,通常包括网络运营商、数据服务类型等信息。本模块主要探讨的是如何在Android应用程序中通过代码来...

    Android开发之系统信息【5】——获取APN列表

    Android 获取 APN 列表的系统信息 Android 系统中对于 APN 的网络 API 没有公开,但是我们可以通过阅读源代码,然后进行数据库操作,系统会自动监听数据库的变化,从而实现开启或者关闭 APN。 APN(Access Point ...

    android 全面解析apn

    Android 全面解析 APN APN(Access Point Name)是 GPRS 背bone 中的一个参考点,指向一个 GGSN(Gateway GPRS Support Node)。GGSN 是一个核心网络设备,负责将用户的数据流量转发到互联网上。APN 是一个字符串,...

    Android APN开发流程分析.doc

    Android APN 开发流程分析 Android APN 开发流程分析是指 Android 操作系统中数据连接的实现过程,主要涉及到数据连接的建立、维护和管理。以下是 Android APN 开发流程分析的关键知识点: 1. 数据连接流程分析 ...

    Android的APN开发源码分析

    ### Android的APN开发源码分析 #### 一、Android数据连接原理 Android的数据连接机制主要是基于PPP(Point-to-Point Protocol)的方式实现的。PPP协议是一种广泛使用的串行链路通信协议,它允许用户通过拨号或其他...

    android中的APN开发

    在Android系统中,APN(Access Point Name)是网络连接的关键配置,用于定义设备如何接入互联网,特别是通过移动数据。APN包含了网络提供商的名称、数据类型、用户名、密码等信息,这些信息决定了手机如何通过运营商...

    设置APN节点,并切换到当前节点

    本项目中,我们关注的重点是如何在Android系统中设置APN,并且实现APN节点的切换,这对于网络服务的提供,特别是在企业级项目中,具有重要的实用价值。 首先,我们要理解APN的作用。APN包含了运营商信息、数据类型...

    android APN开发流程

    ### Android APN开发流程详解 #### 一、数据连接机制概览 Android设备的数据连接机制主要依赖于PPP(Point-to-Point Protocol)协议,这是一套用于在点对点链路上进行数据传输的标准协议,适用于拨号电话、ISDN、X....

    android APN 设置

    4. **切换APN**:在Android应用中,如果需要在`cmnet`和`cmwap`之间切换,可以通过修改当前激活的APN实现。`cmnet`通常用于高速互联网访问,而`cmwap`通常用于WAP浏览,它们的APN设置是不同的。通过调用`...

    android 设置apn

    在Android系统中,APN(Access Point Name)是用于配置移动数据网络连接的重要设置,它定义了设备如何连接到互联网,特别是通过蜂窝数据。APN设置包括运营商、用户名、密码、代理服务器、端口等信息,对于使用特定...

    [Mark安卓教程]Android手机修改APN不保存解决办法.pdf

    ### Android手机修改APN不保存解决办法 #### 一、APN基础知识介绍 APN(Access Point Name,接入点名称)是移动设备访问互联网时必须配置的重要参数之一。它不仅决定了用户通过何种接入方式访问互联网,而且还关联...

    android widget GRRS/3G(APN)上网开关

    本教程将聚焦于创建一个GRRS/3G(GPRS/EDGE和3G网络)APN(Access Point Name,接入点名称)上网开关的Android小部件。这个小部件允许用户快速切换移动数据连接,对于经常需要控制数据流量的用户非常实用。 首先,...

    Android APN文件装换为windowsphones8 APN文件

    由于Android的APN配置信息存储在一个文本文件中,通常命名为“apn.conf”或“apns-conf.xml”,而WP8系统则需要在系统设置内手动创建每个APN条目,这在APN数量众多的情况下非常不便。因此,有一个工具或方法能将...

    国内运营商,中国移动,联通,电信,android上网APN

    国内运营商,中国移动,联通,电信,android上网APN

    海卓APN切换开关_HIAPN_2[1].0.7.apk

    海卓APN切换开关_HIAPN_2[1].0.7.apk,能够实现手机APN的手动开关。

    android 基于基站,apn,gps,wifi,network 根据不同手机sim卡获取经纬度

    在Android系统中,获取地理位置信息是开发者经常遇到的需求。标题提到的“基于基站,APN,GPS,WiFi,Network 根据不同手机SIM卡获取经纬度”涉及了多种定位技术,每种都有其特性和应用场景。下面将详细介绍这些技术...

    Android AT命令与APN开发流程分析

    Android AT命令与APN开发流程分析

    iphone APN切换器 APN Switcher

    iphone手机软件。可以在cmwap和cmnet切换,方便 再更改

Global site tag (gtag.js) - Google Analytics