Android通过APN进行网络连接

简介:
+关注继续查看

APN(Access Point Name),即“接入点名称”,用来标识GPRS的业务种类,目前分为两大类:CMWAP(通过GPRS访问WAP业务)、CMNET(除了WAP以外的服务目前都用CMNET,比如连接因特网等)。你 在通过手机上网时必须配置的一个参数,它决定了你的手机通过哪种接入方式来访问网络。有的中国移动的业务需要走CMWAP接入点才能够连接网络的,在做这类应用的时候,不可避免地需要判断当前APN, 切换APN,以及成功连接到网络后连接到服务器。

由于Android对于APN的网络API没有公开,不过可以通过对数据库操作,系统会自动监听数据库的变化,从而实现开启或者关闭APN。

首先要声明相关的Uri:


  1. Java 代码复制内容到剪贴板  
  2.       
  3. Uri uri = Uri.parse("content://telephony/carriers");        
  4. public static final Uri PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn");    

判断是否存在可用的网络连接:

 


  1. Java 代码复制内容到剪贴板  
  2.       
  3. /**       
  4.      * 判断是否有可用的wifi网络       
  5.      *        
  6.      * @return       
  7.      */        
  8.     public boolean isWIFIAvailable() {        
  9.         for (int i = 0; i < 5; i++) {        
  10.             ConnectivityManager cwjManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);        
  11.             NetworkInfo wifiInfo = cwjManager.getActiveNetworkInfo();        
  12.             if (wifiInfo == null) {        
  13.                 try {        
  14.                     Thread.sleep(1000);        
  15.                 } catch (InterruptedException e) {        
  16.                     e.printStackTrace();        
  17.                 }        
  18.                 continue;        
  19.             } else {        
  20.                 if (wifiInfo.getType() == ConnectivityManager.TYPE_WIFI)        
  21.                     return true;        
  22.             }        
  23.         }        
  24.         return false;        
  25.     }        
  26.         
  27.     /**       
  28.      * 判断是否有可用的网络连接       
  29.      * @return       
  30.      */        
  31.     public boolean isNetWorkAvailable() {        
  32.         for (int i = 0; i < 5; i++) {        
  33.             ConnectivityManager cwjManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);        
  34.             NetworkInfo netInfo = cwjManager.getActiveNetworkInfo();        
  35.             if (netInfo == null) {        
  36.                 try {        
  37.                     Thread.sleep(1000);        
  38.                 } catch (InterruptedException e) {        
  39.                     e.printStackTrace();        
  40.                 }        
  41.                 continue;        
  42.             } else {        
  43.                 if (netInfo.isAvailable()) {        
  44.                     return true;        
  45.                 } else        
  46.                     continue;        
  47.             }        
  48.         }        
  49.         return false;        
  50.     }    

获取MMC、MNC、SimOperator的相关方法(设置APN的时候都有这样的选项):

 


  1. Java 代码复制内容到剪贴板  
  2.       
  3. public String getMCC() {        
  4.         TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);        
  5.         String numeric = tm.getSimOperator();        
  6.         String mcc = numeric.substring(03);        
  7.         return mcc;        
  8.     }        
  9.         
  10.     public String getMNC() {        
  11.         TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);        
  12.         String numeric = tm.getSimOperator();        
  13.         String mnc = numeric.substring(3, numeric.length());        
  14.         return mnc;        
  15.     }        
  16.         
  17.     public String getSimOperator() {        
  18.         TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);        
  19.         String SimOperator = tm.getSimOperator();        
  20.         return SimOperator;        
  21.     }    

新建一个APN:

 


  1. Java 代码复制内容到剪贴板  
  2.       
  3. public String bulidAPN() {        
  4.         ContentResolver resolver = getContentResolver();        
  5.         ContentValues values = new ContentValues();        
  6.         values.put("name""AndroidNet_APN");        
  7.         values.put("apn""#777");        
  8.         values.put("user""ctnet@mycdma.cn");        
  9.         values.put("password""vnet.mobi");        
  10.         values.put("mcc", getMCC());        
  11.         values.put("mnc", getMNC());        
  12.         values.put("numeric", getSimOperator());        
  13.         Cursor c = null;        
  14.         String defaultAPNId = "";        
  15.         try {        
  16.             Uri newRow = resolver.insert(uri, values);        
  17.             if (newRow != null) {        
  18.                 c = resolver.query(newRow, nullnullnullnull);        
  19.                 int idindex = c.getColumnIndex("_id");        
  20.                 c.moveToFirst();        
  21.                 defaultAPNId = c.getString(idindex);        
  22.             }        
  23.         } catch (SQLException e) {        
  24.             defaultAPNId = "";        
  25.         }        
  26.         if (c != null)        
  27.             c.close();        
  28.         return defaultAPNId;        
  29.     }    

通过判断,获取一个可用的网络连接:

 


  1. Java 代码复制内容到剪贴板  
  2.       
  3. /**       
  4.      * 获取网络连接       
  5.      * @param url       
  6.      * @return       
  7.      */        
  8.     public HttpURLConnection getConnection(URL url) {        
  9.         /** 当前APN的id*/        
  10.         String currentAPNId;        
  11.         /**当前APN的用户名*/        
  12.         String currentAPNUser;        
  13.         /**当前APN的密码*/        
  14.         String currentAPNPassword;        
  15.         HttpURLConnection conn = null;        
  16.         /**判断wifi是否可用*/        
  17.         if (isWIFIAvailable()) {        
  18.             try {        
  19.                 conn = (HttpURLConnection) url.openConnection();        
  20.                 /**连接超时时间*/        
  21.                 conn.setConnectTimeout(100000);        
  22.                 conn.setReadTimeout(100000);        
  23.             } catch (IOException e) {        
  24.                 e.printStackTrace();        
  25.                 conn = null;        
  26.                 return conn;        
  27.             }        
  28.             return conn;        
  29.         }        
  30.         
  31.         Cursor mCursor_APN = getContentResolver().query(PREFERRED_APN_URI,        
  32.                 nullnullnullnull);        
  33.         if (mCursor_APN == null || !mCursor_APN.moveToNext()) {        
  34.             return null;        
  35.         } else {        
  36.             currentAPNId = mCursor_APN.getString(mCursor_APN        
  37.                     .getColumnIndex("_id"));        
  38.             currentAPNUser = mCursor_APN.getString(mCursor_APN        
  39.                     .getColumnIndex("user"));        
  40.             currentAPNPassword = mCursor_APN.getString(mCursor_APN        
  41.                     .getColumnIndex("password"));        
  42.             mCursor_APN.close();        
  43.         }        
  44.         
  45.         if (!(currentAPNUser.equals("ctnet@mycdma.cn")        
  46.                 && currentAPNPassword.equals("vnet.mobi") || currentAPNUser        
  47.                 .equals("ctwap@mycdma.cn")        
  48.                 && currentAPNPassword.equals("vnet.mobi"))) {        
  49.             /**既不是wap又不是net上网方式需要指定上网方式*/        
  50.             Cursor mCursor_APN_Defalut = getContentResolver().query(uri, null,        
  51.                     " user=? and password=?",        
  52.                     new String[] { "ctnet@mycdma.cn""vnet.mobi" }, null);        
  53.             if (mCursor_APN_Defalut == null        
  54.                     || !mCursor_APN_Defalut.moveToNext()) {        
  55.                 /** 不存在ctnet则重新建立一个连接*/        
  56.                 mCursor_APN_Defalut.close();// 关闭连接        
  57.                 String DefalutAPNId = bulidAPN();        
  58.                 if (DefalutAPNId == null || DefalutAPNId.equals("")        
  59.                         || DefalutAPNId.equals(" "))// 创建新的APN失败        
  60.                 {        
  61.                     return null;        
  62.                 }        
  63.                 ContentResolver resolver = getContentResolver();        
  64.                 ContentValues values = new ContentValues();        
  65.                 values.put("apn_id", DefalutAPNId);        
  66.                 resolver.update(PREFERRED_APN_URI, values, nullnull);        
  67.             } else {// 使用系统默认的APN连接        
  68.                 String DefalutAPNId = mCursor_APN_Defalut        
  69.                         .getString(mCursor_APN_Defalut.getColumnIndex("_id"));        
  70.                 ContentResolver resolver = getContentResolver();        
  71.                 ContentValues values = new ContentValues();        
  72.                 values.put("apn_id", DefalutAPNId);        
  73.                 resolver.update(PREFERRED_APN_URI, values, nullnull);        
  74.                 mCursor_APN_Defalut.close();        
  75.             }        
  76.             try {        
  77.                 Thread.sleep(8000L);        
  78.             } catch (InterruptedException e) {        
  79.                 e.printStackTrace();        
  80.             }        
  81.         }        
  82.         
  83.         /** wap需要代理*/        
  84.         if ((android.net.Proxy.getDefaultHost()) != null) {        
  85.             try {        
  86.                 java.net.Proxy p = new java.net.Proxy(java.net.Proxy.Type.HTTP,        
  87.                         new InetSocketAddress(        
  88.                                 android.net.Proxy.getDefaultHost(),        
  89.                                 android.net.Proxy.getDefaultPort()));        
  90.                 conn = (HttpURLConnection) url.openConnection(p);        
  91.                 conn.setConnectTimeout(100000);        
  92.                 conn.setReadTimeout(100000);        
  93.             } catch (Exception e) {        
  94.                 conn = null;        
  95.             }        
  96.             return conn;        
  97.         }        
  98.         /**net不需要代理*/        
  99.         if ((android.net.Proxy.getDefaultHost()) == null) {        
  100.             try {        
  101.                 conn = (HttpURLConnection) url.openConnection();        
  102.                 conn.setConnectTimeout(100000);        
  103.                 Log.v("http""nohttpdaili");        
  104.             } catch (Exception e) {        
  105.                 conn = null;        
  106.             }        
  107.             return conn;        
  108.         }        
  109.         return conn;        
  110.         
  111.     }    

 



     本文转自06peng 51CTO博客,原文链接:http://blog.51cto.com/06peng/962791,如需转载请自行联系原作者



相关文章
|
10月前
|
XML 数据库 Android开发
android 修改默认APN
android 修改默认APN
232 0
|
监控 Android开发
Android网络连接判断与处理
Android网络连接判断与处理
|
网络协议 Java API
Android多个网络连接
新增的多网络功能允许应用查询可用网络提供的功能,例如它们是 WLAN 网络、蜂窝网络还是按流量计费网络,或者它们是否提供特定网络功能。然后应用可以请求连接并对连接丢失或其他网络变化作出响应。 Android 5.0 提供了新的多网络 API,允许您的应用动态扫描具有特定能力的可用网络,并与它们建立连接。
26483 0
|
JavaScript Android开发 前端开发
|
Android开发 Apache UED
Android官方开发文档Training系列课程中文版:网络操作之网络连接
原文地址:http://android.xsoftlab.net/training/basics/network-ops/index.html 引言 这节课将会学习最基本的网络连接,监视网络连接状况及网络控制等内容。
837 0
|
监控 Java Android开发
浅析android下如何通过jni监控wifi网络连接、dhcpcd执行和power电源控制
libs/android_runtime/android_net_wifi_Wifi.cpp部分jni接口static JNINativeMethod gWifiMethods[] = {{ "loadDriver", "()Z", (void *)android_net_wifi_loadDriv...
1345 0
|
Android开发 数据安全/隐私保护 数据格式
12_Android中HttpClient的应用,doGet,doPost,doHttpClientGet,doHttpClient请求,另外借助第三方框架实现网络连接的应用,
 准备条件, 编写一个web项目。编写一个servlet,若用户名为lisi,密码为123,则返回“登录成功”,否则”登录失败”。项目名为ServerItheima28。代码如下: package com.itheima28.servlet;   import java.io.IOException; import java.io.PrintWriter;
1260 0
热门文章
最新文章
相关产品
云迁移中心
推荐文章
更多