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网络访问超时
Android网络访问超时
18 2
|
1月前
|
Java Linux API
统计android设备的网络数据使用量
统计android设备的网络数据使用量
27 0
|
1月前
|
编解码 开发工具 Android开发
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)2
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)2
62 2
|
7天前
|
安全 Android开发 数据安全/隐私保护
同样的 APP 为何在 Android 8 以后网络感觉变卡?
【6月更文挑战第8天】Android 8 及以后系统中,APP 网络感觉变卡源于更严格的安全机制和后台限制,系统对网络优化的侧重改变,以及APP自身兼容性问题。开发者需优化APP,适应新系统,用户可更新APP或检查权限设置。通过共同努力,有望改善网络卡顿现象,提升用户体验。
|
12天前
|
XML 网络协议 Java
53. 【Android教程】Socket 网络接口
53. 【Android教程】Socket 网络接口
15 0
|
15天前
|
JSON Android开发 开发者
构建高效Android应用:采用Kotlin协程优化网络请求
【5月更文挑战第31天】 在移动开发领域,尤其是针对Android平台,网络请求的管理和性能优化一直是开发者关注的焦点。随着Kotlin语言的普及,其提供的协程特性为异步编程提供了全新的解决方案。本文将深入探讨如何利用Kotlin协程来优化Android应用中的网络请求,从而提升应用的响应速度和用户体验。我们将通过具体实例分析协程与传统异步处理方式的差异,并展示如何在现有项目中集成协程进行网络请求优化。
|
17天前
|
安全 网络安全 Android开发
安卓应用开发:打造流畅的用户体验网络安全与信息安全:防御前线的技术与意识
【5月更文挑战第29天】在移动应用市场中,用户对流畅体验的要求日益提高。针对安卓平台,开发者需深入理解系统原理、内存管理及性能优化策略。本文旨在探讨安卓应用开发中的关键技术和工具,包括布局优化、内存泄漏防治以及使用Kotlin语言的优势,以期为读者提供实用的性能提升指导和实践建议。
|
25天前
|
移动开发 安全 Android开发
构建高效Android应用:采用Kotlin协程优化网络请求
【5月更文挑战第21天】 在移动开发领域,尤其是针对Android平台,网络请求的处理一直是影响应用性能和用户体验的关键因素。随着现代应用对实时性和响应速度要求的不断提高,传统的同步阻塞或异步回调模式已不再满足开发者的需求。本文将探讨利用Kotlin协程来简化Android应用中的网络请求处理,实现非阻塞的并发操作,并提升应用的整体性能和稳定性。我们将深入分析协程的原理,并通过一个实际案例展示如何在Android项目中集成和优化网络请求流程。
|
30天前
|
设计模式 算法 Android开发
2024年Android网络编程总结篇,androidview绘制流程面试
2024年Android网络编程总结篇,androidview绘制流程面试
2024年Android网络编程总结篇,androidview绘制流程面试
|
1月前
|
Android开发
android检测网络连接是否存在(一)
android检测网络连接是否存在(一)
15 2