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



相关文章
|
2月前
|
数据库 Android开发 开发者
构建高效Android应用:采用Kotlin协程优化网络请求处理
【2月更文挑战第30天】 在移动应用开发领域,网络请求的处理是影响用户体验的关键环节。针对Android平台,利用Kotlin协程能够极大提升异步任务处理的效率和简洁性。本文将探讨如何通过Kotlin协程优化Android应用中的网络请求处理流程,包括协程的基本概念、网络请求的异步执行以及错误处理等方面,旨在帮助开发者构建更加流畅和响应迅速的Android应用。
|
4月前
|
安全 API Android开发
Android网络和数据交互: 解释Retrofit库的作用。
Android网络和数据交互: 解释Retrofit库的作用。
41 0
|
4月前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
22 0
|
1月前
|
编解码 Android开发
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)1
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)
60 1
|
5月前
|
XML Java Android开发
Android App开发网络通信中使用okhttp下载和上传图片、文件讲解及实战(超详细实现用户注册信息上传 附源码)
Android App开发网络通信中使用okhttp下载和上传图片、文件讲解及实战(超详细实现用户注册信息上传 附源码)
167 0
|
3天前
|
Java Linux API
统计android设备的网络数据使用量
统计android设备的网络数据使用量
12 0
|
1月前
|
编解码 开发工具 Android开发
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)2
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)2
37 2
|
1天前
|
Android开发
android检测网络连接是否存在(一)
android检测网络连接是否存在(一)
|
16天前
|
移动开发 Java Android开发
构建高效Android应用:采用Kotlin协程优化网络请求
【4月更文挑战第24天】 在移动开发领域,尤其是对于Android平台而言,网络请求是一个不可或缺的功能。然而,随着用户对应用响应速度和稳定性要求的不断提高,传统的异步处理方式如回调地狱和RxJava已逐渐显示出局限性。本文将探讨如何利用Kotlin协程来简化异步代码,提升网络请求的效率和可读性。我们将深入分析协程的原理,并通过一个实际案例展示如何在Android应用中集成和优化网络请求。
|
17天前
|
存储 应用服务中间件 网络安全
Android 网络链接稳定性测试解决方案
Android 网络链接稳定性测试解决方案
20 0