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,如需转载请自行联系原作者



相关文章
|
1月前
|
数据库 Android开发 开发者
构建高效Android应用:采用Kotlin协程优化网络请求处理
【2月更文挑战第30天】 在移动应用开发领域,网络请求的处理是影响用户体验的关键环节。针对Android平台,利用Kotlin协程能够极大提升异步任务处理的效率和简洁性。本文将探讨如何通过Kotlin协程优化Android应用中的网络请求处理流程,包括协程的基本概念、网络请求的异步执行以及错误处理等方面,旨在帮助开发者构建更加流畅和响应迅速的Android应用。
|
3月前
|
安全 API Android开发
Android网络和数据交互: 解释Retrofit库的作用。
Android网络和数据交互: 解释Retrofit库的作用。
39 0
|
3月前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
22 0
|
4月前
|
XML Java Android开发
Android App开发网络通信中使用okhttp下载和上传图片、文件讲解及实战(超详细实现用户注册信息上传 附源码)
Android App开发网络通信中使用okhttp下载和上传图片、文件讲解及实战(超详细实现用户注册信息上传 附源码)
142 0
|
1天前
|
移动开发 Java Android开发
构建高效Android应用:采用Kotlin协程优化网络请求
【4月更文挑战第24天】 在移动开发领域,尤其是对于Android平台而言,网络请求是一个不可或缺的功能。然而,随着用户对应用响应速度和稳定性要求的不断提高,传统的异步处理方式如回调地狱和RxJava已逐渐显示出局限性。本文将探讨如何利用Kotlin协程来简化异步代码,提升网络请求的效率和可读性。我们将深入分析协程的原理,并通过一个实际案例展示如何在Android应用中集成和优化网络请求。
|
9天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
10 0
|
9天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
9 0
|
4月前
|
XML JSON Java
Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)
Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)
168 0
|
3月前
|
JSON Java Android开发
Android网络和数据交互: 请解释Android中的JSON解析库,如Gson。
Android网络和数据交互: 请解释Android中的JSON解析库,如Gson。
24 0