Android代码中实现WAP方式联网(转载!)

转载地址:http://www.linuxidc.com/Linux/2012-08/67980.htm

学习中,用到的,记录下。

无论是移动、联通还是电信,都至少提供了两种类型的的APN:WAP方式和NET方式。其中NET方式跟WIFI方式一样,无需任何设置,可自由访问所有类型网站,而WAP方式,需要手机先设置代理服务器和端口号等信息,并且只能访问HTTP协议类型的网站。

1) 移动的WAP名称是CMWAP,NET名称是CMNET;

2) 联通的WAP名称是UNIWAP,NET名称是UNINET;联通3G的WAP名称是3GWAP,NET名称是3GNET;

3) 电信的WAP名称是CTWAP,NET名称是CTNET;

其中,移动和联通的WAP代理服务器都是10.0.0.172,端口号是80;而电信的WAP代理服务器是10.0.0.200,端口号是80。

Android系统中,对于APN网络的API是隐藏的,因此获取手机的APN设置,需要通过ContentProvider来进行数据库查询,查询的URI地址是:

取得全部的APN列表:content://telephony/carriers;

取得当前设置的APN:content://telephony/carriers/preferapn;

取得current=1的APN:content://telephony/carriers/current;

下面我们的代码就是获取当前首选的APN设置,并继承HttpClient,实现我们自己的代理HttpClient类。首先来看下APN的管理类的实现,这个类的主要功能是获得APN的代理服务器和端口号,查询用的URI如下:

由这个URI使用ContentResolver获得游标对象,之后就是查询操作了,分别查处当前手机所设置的APN、Proxy和Port,而如果手机的Proxy没有设置,则需要根据APN来决定当前应该连接的代理服务器地址和端口号,详细代码如下所示:

通过APNManager类获取到当前手机的WAP设置的代理和端口之后,就可以构造我们自己的代理HttpClient了,这个类定义为ProxyHttpClient,在该类的构造函数中,首先获得APNManager的实例,然后获取代理服务器proxy和端口值port,通过这两个参数构造HttpHost实例,并将host实例设置为ConnRouteParams.DEFAULT_PROXY的值,详细代码截图如下所示:

APNManager类完整定义如下:

  1. package com.hust.iprai;
  2. import android.content.ContentResolver;
  3. import android.content.Context;
  4. import android.database.Cursor;
  5. import android.net.ConnectivityManager;
  6. import android.net.NetworkInfo;
  7. import android.net.Uri;
  8. public class APNManager {
  9. public static final Uri PREFERRED_APN_URI;
  10. private String mApn; // 接入点名称
  11. private String mPort; // 端口号
  12. private String mProxy; // 代理服务器
  13. private boolean mUseWap; // 是否正在使用WAP
  14. static {
  15. PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn"); // 取得当前设置的APN
  16. }
  17. public APNManager(Context context) {
  18. checkNetworkType(context);
  19. }
  20. /**
  21. * 获得当前设置的APN相关参数
  22. * @param context
  23. */
  24. private void checkApn(Context context) {
  25. ContentResolver contentResolver = context.getContentResolver();
  26. Uri uri = PREFERRED_APN_URI;
  27. String[] apnInfo = new String[3];
  28. apnInfo[0] = "apn";
  29. apnInfo[1] = "proxy";
  30. apnInfo[2] = "port";
  31. Cursor cursor = contentResolver.query(uri, apnInfo, nullnullnull);
  32. if (cursor != null) {
  33. while (cursor.moveToFirst()) {
  34. this.mApn = cursor.getString(cursor.getColumnIndex("apn"));
  35. this.mProxy = cursor.getString(cursor.getColumnIndex("proxy"));
  36. this.mPort = cursor.getString(cursor.getColumnIndex("port"));
  37. // 代理为空
  38. if ((this.mProxy == null) || (this.mProxy.length() <= 0)) {
  39. String apn = this.mApn.toUpperCase();
  40. // 中国移动WAP设置:APN:CMWAP;代理:10.0.0.172;端口:80
  41. // 中国联通WAP设置:APN:UNIWAP;代理:10.0.0.172;端口:80
  42. // 中国联通WAP设置(3G):APN:3GWAP;代理:10.0.0.172;端口:80
  43. if ((apn.equals("CMWAP")) || (apn.equals("UNIWAP")) || (apn.equals("3GWAP"))) {
  44. this.mUseWap = true;
  45. this.mProxy = "10.0.0.172";
  46. this.mPort = "80";
  47. break;
  48. }
  49. // 中国电信WAP设置:APN(或者接入点名称):CTWAP;代理:10.0.0.200;端口:80
  50. if (apn.equals("CTWAP")) {
  51. this.mUseWap = true;
  52. this.mProxy = "10.0.0.200";
  53. this.mPort = "80";
  54. break;
  55. }
  56. }
  57. this.mPort = "80";
  58. this.mUseWap = true;
  59. break;
  60. }
  61. }
  62. this.mUseWap = false;
  63. cursor.close();
  64. }
  65. /**
  66. * 检测当前使用的网络类型是WIFI还是WAP
  67. * @param context
  68. */
  69. private void checkNetworkType(Context context) {
  70. NetworkInfo networkInfo = ((ConnectivityManager) context
  71. .getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
  72. if (networkInfo != null) {
  73. if (!"wifi".equals(networkInfo.getTypeName().toLowerCase())) {
  74. checkApn(context);
  75. return;
  76. }
  77. this.mUseWap = false;
  78. }
  79. }
  80. /**
  81. * 判断当前网络连接状态
  82. * @param context
  83. * @return
  84. */
  85. public static boolean isNetworkConnected(Context context) {
  86. NetworkInfo networkInfo = ((ConnectivityManager) context
  87. .getApplicationContext().getSystemService("connectivity"))
  88. .getActiveNetworkInfo();
  89. if (networkInfo != null) {
  90. return networkInfo.isConnectedOrConnecting();
  91. }
  92. return false;
  93. }
  94. public String getApn() {
  95. return this.mApn;
  96. }
  97. public String getProxy() {
  98. return this.mProxy;
  99. }
  100. public String getProxyPort() {
  101. return this.mPort;
  102. }
  103. public boolean isWapNetwork() {
  104. return this.mUseWap;
  105. }
  106. }

ProxyHttpClient类完整定义如下:

    1. package com.hust.iprai;
    2. import android.content.Context;
    3. import android.text.TextUtils;
    4. import android.util.Log;
    5. import org.apache.http.HttpHost;
    6. import org.apache.http.conn.params.ConnRouteParams;
    7. import org.apache.http.impl.client.DefaultHttpClient;
    8. import org.apache.http.params.HttpConnectionParams;
    9. import org.apache.http.params.HttpParams;
    10. import org.apache.http.params.HttpProtocolParams;
    11. public class ProxyHttpClient extends DefaultHttpClient {
    12. private static final int HTTP_TIMEOUT_MS = 30 * 1000;
    13. private static final int BUFFER_SIZE = 1024 * 8;
    14. private static final String TAG = ProxyHttpClient.class.getSimpleName();
    15. private RuntimeException mLeakedException = new IllegalStateException("ProxyHttpClient created and never closed");
    16. private String mPort;
    17. private String mProxy;
    18. private boolean mUseWap;
    19. public ProxyHttpClient(Context context) {
    20. this(context, nullnull);
    21. }
    22. public ProxyHttpClient(Context context, APNManager manager) {
    23. this(context, null, manager);
    24. }
    25. public ProxyHttpClient(Context context, String userAgent) {
    26. this(context, userAgent, null);
    27. }
    28. public ProxyHttpClient(Context context, String userAgent, APNManager manager) {
    29. if (manager == null) {
    30. manager = new APNManager(context);
    31. }
    32. this.mUseWap = manager.isWapNetwork();
    33. this.mProxy = manager.getProxy();
    34. this.mPort = manager.getProxyPort();
    35. if (this.mUseWap) {
    36. HttpHost host = new HttpHost(this.mProxy, Integer.valueOf(this.mPort).intValue());
    37. getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, host); // 设置代理
    38. }
    39. HttpConnectionParams.setConnectionTimeout(getParams(), HTTP_TIMEOUT_MS);
    40. HttpConnectionParams.setSoTimeout(getParams(), HTTP_TIMEOUT_MS);
    41. HttpConnectionParams.setSocketBufferSize(getParams(), BUFFER_SIZE);
    42. if (!TextUtils.isEmpty(userAgent)) {
    43. HttpProtocolParams.setUserAgent(getParams(), userAgent);
    44. }
    45. }
    46. public void close() {
    47. if (this.mLeakedException != null) {
    48. getConnectionManager().shutdown();
    49. this.mLeakedException = null;
    50. }
    51. }
    52. protected HttpParams createHttpParams() {
    53. HttpParams params = super.createHttpParams();
    54. HttpProtocolParams.setUseExpectContinue(params, false);
    55. return params;
    56. }
    57. protected void finalize() throws Throwable {
    58. super.finalize();
    59. if (this.mLeakedException != null) {
    60. Log.e(TAG, "Leak found", this.mLeakedException);
    61. }
    62. }
    63. }
时间: 2024-11-05 11:52:49

Android代码中实现WAP方式联网(转载!)的相关文章

从Android代码中来记忆23种设计模式

我的简书同步发布:从Android代码中来记忆23种设计模式 相信大家都曾经下定决心把23种设计模式牢记于心,每次看完之后过一段时间又忘记了~,又得回去看,脑子里唯一依稀记得的是少数设计模式的大致的定义.其实,网上很多文章讲得都非常好,我也曾经去看过各种文章.也曾一直苦恼这些难以永久记下的设计模式,直到我接触到了<Android源码设计模式解析与实战>--何红辉与关爱明著,发现原来其实我们在Android中都接触过这些设计模式,只是我们不知道而已.既然我们都接触过,我们只需一一对号入座,对设计

Android代码中更改TextView颜色

项目中,需要在代码中动态更改TextView的颜色,原先使用如下: text.setTextColor(R.color.black); 为生效,查阅资料后,正确写法如下: text.setTextColor(context.getResources().getColor(R.color.black)); 或: text.setTextColor(getResources().getColorStateList(R.color.black)); Android代码中更改TextView颜色

Android代码中动态设置图片的大小(自动缩放),位置

项目中需要用到在代码中动态调整图片的位置和设置图片大小,能自动缩放图片,用ImageView控件,具体做法如下: 1.布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"

(七)android开发中两种方式监听短信的原理和实现

一.监听短信的两种方式的简介 Android程序开发中,有两种方式监听短信内容:一.接收系统的短信广播:二.应用观察者模式,监听短信数据库. 第一种方式接收系统的短信广播: A.这种方式只对新收到的短消息有效,运行代码,并不会读取收件箱中已读或未读的消息,只有当收到新来的短消息时,才会执行onReceive()方法. B.并且这个广播是有序广播,如果当别的程序先读取到了这个广播,然后拦截掉了个这个广播,你将接收不到.当然我们可以通过设置priority的数值,其实有时是不管用的,现在在一些定制的

Android 在Android代码中执行命令行

1.路径最好不要是自己拼写的路径/mnt/shell/emulated/0/wifidog.conf 最好是通过方法获取的路径,不然可能导致命令无效  (挂载点的原因) public static final String SDCARD_ROOT=Environment.getExternalStorageDirectory().getAbsolutePath(); public static final String AAA_PATH=SDCARD_ROOT+"/wifidog.conf&qu

android 代码中及xml中设置透明

在布局文件的属性中,比如要设置一个LineaerLayout的背景为灰色透明.首先查RGB颜色表灰色是:#9E9E9E,AA代表透明,(透明度从00到FF,00表示完全透明),所以,设置其属性:android:background="#AA9E9E9E",其中前两位为透明度,后六位为颜色. Java代码 View v = findViewById(R.id.content);//找到你要设透明背景的layout 的id v.getBackground().setAlpha(100);/

Android:改变Activity切换方式(转载)

overridePendingTransition(enterAnim, exitAnim); Intent intent =new Intent(this,item2.class); startActivity(intent); this.finish(); overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right); 要整个应用改切换方式的话,那就用style控制吧 1.在res

Android 代码中使用Color工具类 parseColor

方式一: arg1.setBackgroundColor(Color.parseColor("#87CEFA")); 方式二: arg1.setBackgroundColor(getResources().getColor(R.color.crowd));

Android 代码中设置Color参数

今天想绘制一条根据参数颜色动态变化的曲线,参数不固定,因此需要根据参数来获取颜色值.研究了很久,搞了一个通过Paint实现的方案. Paint 中包含了很多方法对其属性进行设置,主要方法如下: setAntiAlias: 设置画笔的锯齿效果. setColor: 设置画笔颜色 setARGB:  设置画笔的a,r,p,g值. setAlpha:  设置Alpha值 setTextSize: 设置字体尺寸. setStyle:  设置画笔风格,空心或者实心. setStrokeWidth: 设置空