Android设置Proxy访问网络
2013-06-25 19:11
148 查看
Android应用程序访问互联网资源时,在Wifi的情况下处理网络连接按照上文所讲述的方法步骤即可顺利实现;但如果当前Android设备的联网方式是通过移动运营商的网络服务为中转,间接访问的互联网资源时,则就涉及到在创建HTTP链接之前需要设置Proxy,即可尽量避免网络中断访问的情况,顺利访问互联网。Proxy中文即代理。已经插入手机卡的Android设备,点击"设置"→"无线和网络"→"移动网络设置"→"接入点名称",任意点击一接入点,此时显示的内容即为当前运营商为使Android设备通过运营商网络顺利接入互联网而需要设置的代理信息。通常,中国移动的接入点为CMWAP,代理IP是10.0.0.172,端口为80。由于不同运营商其代理设置的不同,为保证代码的一致性及有效性,开发过程中需要封装出能够自适应各种不同Proxy环境并且能够顺利访问互联网的联网代码。封装后的方法为openUrl(),代码如下:
由于需要设置Proxy的情况为使用运营商网络,所以代码一开始即使用通过Context获得ConnectivityManager,执行ConnectivityManager.getActiveNetworkInfo()获取当前可用的网络。在有可用网络的情况下,判断其类型,如果networkInfo.getType()返回值为ConnectivityManager.TYPE_MOBILE,则需要设置Proxy;在返回值为ConnectivityManager.TYPE_WIFI的情况下则跳过设置Proxy的步骤。对HttpURLConnection设置Proxy需要指定代理IP及端口号,android.net.Proxy解决了这个问题。执行Proxy.getDefaultHost()和Proxy.getDefaultPort()将返回代理主机的IP及开放端口号,并以这两个信息传参构造InetSocketAddress。InetSocketAddress为IP套接地址,其主要形式可由IP地址与端口号组合而成,亦可用主机域名加端口号组合而成,这种情况下将尝试将主机域名解析为IP地址。封装的方法openUrl()两个参数中第二个参数为网络链接地址,将该地址构造出URL实例后,使用URL.getProtocol()方法即可知该链接地址所使用的协议类型。使用得到的链接协议类型,执行java.net.Proxy.Type的valueOf()方法进一步得到所需Proxy.Type。在InetSocketAddress及Proxy.Type确定的情况下,即可构造java.net.Proxy实例,执行代码为new java.net.Proxy(proxyType, inetAddress)。将新生成的Proxy对象做为参数,执行URL.openConnection(javaProxy),即可得到使用Proxy设置连接互联网的HttpURLConnection。
01 | public static HttpURLConnection openUrl(Context context, String urlStr) { |
02 | URLurlURL = null ; |
03 | HttpURLConnectionhttpConn = null ; |
04 | try { |
05 | urlURL= new URL(urlStr); |
06 | //需要android.permission.ACCESS_NETWORK_STATE |
07 | //在没有网络的情况下,返回值为null。 |
08 | NetworkInfonetworkInfo = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)) |
09 | .getActiveNetworkInfo(); |
10 | //如果是使用的运营商网络 |
11 | if (networkInfo!= null ){ |
12 | if (networkInfo.getType()== ConnectivityManager.TYPE_MOBILE) { |
13 | //获取默认代理主机ip |
14 | Stringhost = android.net.Proxy.getDefaultHost(); |
15 | //获取端口 |
16 | int port= android.net.Proxy.getDefaultPort(); |
17 | if (host!= null &&port != - 1 ){ |
18 | //封装代理連接主机IP与端口号。 |
19 | InetSocketAddressinetAddress = new InetSocketAddress(host,port); |
20 | //根据URL链接获取代理类型,本链接适用于TYPE.HTTP |
21 | java.net.Proxy.TypeproxyType = java.net.Proxy.Type.valueOf(urlURL.getProtocol().toUpperCase()); |
22 | java.net.ProxyjavaProxy = new java.net.Proxy(proxyType,inetAddress); |
23 | httpConn= (HttpURLConnection) urlURL.openConnection(javaProxy); |
24 | } else { |
25 | httpConn= (HttpURLConnection) urlURL.openConnection(); |
26 | } |
27 | } else { |
28 | httpConn= (HttpURLConnection) urlURL.openConnection(); |
29 | } |
30 | httpConn.setConnectTimeout(Const.NETWORK_OPEN_TIMEOUT); |
31 | httpConn.setReadTimeout(Const.NETWORK_READ_TIMEOUT); |
32 | httpConn.setDoInput( true ); |
33 | } else { |
34 | //LogOut.out(this, "No Avaiable Network"); |
35 | } |
36 | } catch (NullPointerExceptionnpe) { |
37 | npe.printStackTrace(); |
38 | } catch (MalformedURLExceptione) { |
39 | e.printStackTrace(); |
40 | } catch (IOExceptione) { |
41 | e.printStackTrace(); |
42 | } |
43 | return httpConn; |
44 | } |
相关文章推荐
- Android设置代理访问网络Proxy
- android访问网络,下载图片,并设置UI
- [Android]正确地访问网络资源----Proxy的使用
- 在android AndroidManifest.xml文件中怎样设置访问网络的权限
- 设置Proxy访问网络
- android 访问移动网络时的wap代理设置
- Android (cocos2dx 网络访问)访问权限设置
- [Android]正确地访问网络资源----Proxy的使用
- Android 访问网络连接设置界面
- Java反射机制,测试,android访问网络授权设置
- android 网络访问超时
- 在android使用mina实现网络访问
- Android网络访问
- 【转】Android 的cpu 硬盘 内存 网络设置 系统信息 硬件信息
- android retrofit设置网络请求超时时间
- Android 网络显示图片 通过代理访问
- Android 4.x 在 https 协议下无法利用 okhttp 进行网络访问的临时解决办法
- Android使用HTTP协议访问网络——HttpClient
- Android中 检查网络连接状态的变化,无网络时跳转到设置界面