Android 系统net和wap接入点的区别

我们使用Android设备连接网络时,如果是wap接入点就需要设置代理,而电信和移动联通的代理并不相同,移动和联通的wap代理都是10.0.0.172:80,电信的wap代理是10.0.0.200:80,所以进行Android开发时很有必要判断接入点。

接入点的类型

Net网络:运营商(移动联通电信)net网络,wifi,usb网络共享

Wap网络:移动联通wap(代理相同:10.0.0.172:80),电信wap(代理:10.0.0.200:80)

这样看来就可以抽象出三种网络类型:联通移动wap,电信wap,其他的都是net类型。

       接入点判断实例

下面给出了接入点判断的实例代码,其中进行了一些注解,都是一些在实际项目开发中需要注意的地方。分享给大家以供参考。

Java代码

package com.johnson.utils;
import com.shoowc.R;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;  

public class EX01_CheckApnTypeActivity extends Activity {
 /** Called when the activity is first created. */
 public static final  String CTWAP = "ctwap";
 public static final  String CMWAP = "cmwap";
 public static final  String WAP_3G = "3gwap";
 public static final  String UNIWAP = "uniwap";
 public static final  int TYPE_NET_WORK_DISABLED = 0;// 网络不可用
 public static final  int TYPE_CM_CU_WAP = 4;// 移动联通wap10.0.0.172
 public static final  int TYPE_CT_WAP = 5;// 电信wap 10.0.0.200
 public static final  int TYPE_OTHER_NET = 6;// 电信,移动,联通,wifi 等net网络
 public static Uri PREFERRED_APN_URI = Uri
 .parse("content://telephony/carriers/preferapn");
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);  

  checkNetworkType(this);
 }  

 /***
  * 判断Network具体类型(联通移动wap,电信wap,其他net)
  *
  * */
 public static int checkNetworkType(Context mContext) {
  try {
   final ConnectivityManager connectivityManager = (ConnectivityManager) mContext
     .getSystemService(Context.CONNECTIVITY_SERVICE);
   final NetworkInfo mobNetInfoActivity = connectivityManager
     .getActiveNetworkInfo();
   if (mobNetInfoActivity == null || !mobNetInfoActivity.isAvailable()) {  

    // 注意一:
    // NetworkInfo 为空或者不可以用的时候正常情况应该是当前没有可用网络,
    // 但是有些电信机器,仍可以正常联网,
    // 所以当成net网络处理依然尝试连接网络。
    // (然后在socket中捕捉异常,进行二次判断与用户提示)。  

    Log.i("", "=====================>无网络");
    return TYPE_OTHER_NET;
   } else {  

    // NetworkInfo不为null开始判断是网络类型  

    int netType = mobNetInfoActivity.getType();
    if (netType == ConnectivityManager.TYPE_WIFI) {
     // wifi net处理
     Log.i("", "=====================>wifi网络");
     return TYPE_OTHER_NET;
    } else if (netType == ConnectivityManager.TYPE_MOBILE) {  

     // 注意二:
     // 判断是否电信wap:
     //不要通过getExtraInfo获取接入点名称来判断类型,
     // 因为通过目前电信多种机型测试发现接入点名称大都为#777或者null,
     // 电信机器wap接入点中要比移动联通wap接入点多设置一个用户名和密码,
     // 所以可以通过这个进行判断!  

     final Cursor c = mContext.getContentResolver().query(
       PREFERRED_APN_URI, null, null, null, null);
     if (c != null) {
      c.moveToFirst();
      final String user = c.getString(c
        .getColumnIndex("user"));
      if (!TextUtils.isEmpty(user)) {
       Log.i("",
         "=====================>代理:"
           + c.getString(c
             .getColumnIndex("proxy")));
       if (user.startsWith(CTWAP)) {
        Log.i("", "=====================>电信wap网络");
        return TYPE_CT_WAP;
       }
      }
     }
     c.close();  

     // 注意三:
     // 判断是移动联通wap:
     // 其实还有一种方法通过getString(c.getColumnIndex("proxy")获取代理ip
     //来判断接入点,10.0.0.172就是移动联通wap,10.0.0.200就是电信wap,但在
     //实际开发中并不是所有机器都能获取到接入点代理信息,例如魅族M9 (2.2)等...
     // 所以采用getExtraInfo获取接入点名字进行判断  

     String netMode = mobNetInfoActivity.getExtraInfo();
     Log.i("", "netMode ================== " + netMode);
     if (netMode != null) {
      // 通过apn名称判断是否是联通和移动wap
      netMode=netMode.toLowerCase();
      if (netMode.equals(CMWAP) || netMode.equals(WAP_3G)
        || netMode.equals(UNIWAP)) {
       Log.i("", "=====================>移动联通wap网络");
       return TYPE_CM_CU_WAP;
      }  

     }  

    }
   }
  } catch (Exception ex) {
   ex.printStackTrace();
   return TYPE_OTHER_NET;
  }  

  return TYPE_OTHER_NET;  

 }
}

以上是完整的实例代码,另外附加了详细的注解,相信大家能够看的很明白了。

通过此文,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android Gradle Build Error:Some file crunching failed, see logs for details的快速解决方法

    错误日志:Error:java.lang.RuntimeException: Some file crunching failed, see logs for details Log: FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:mergeDebugResources'. > Error: java.lang.RuntimeException: Crunch

  • Android更新UI的四种方法详解

    前言 相信每位Android开发者们都知道更新UI只能在主线程中进行,若是在子线程执行任务后需要更新UI,则需要借助handler跳转到主线程中.以下介绍几种操作UI的方法. 一.使用Handler的handleMessage() Handler的构造 public Handler() { this(null, false); } public Handler(Callback callback, boolean async) { if (FIND_POTENTIAL_LEAKS) { fina

  • PHP简单判断iPhone、iPad、Android及PC设备的方法

    本文实例讲述了PHP简单判断iPhone.iPad.Android及PC设备的方法.分享给大家供大家参考,具体如下: 因为工作需要我们需要知道是什么样了用户访问了我网站了,现在的移动设备种类多了,下面我们一起来看小编整理的一段PHP判断iPhone.iPad.Android.PC设备的例子. 我将使用Windows系统的设备定为PC,毕竟博客面向中国用户,大部分家用设备还是用的Windows系统. 原理是判断浏览器提交的USER AGENT,代码如下: <?php //获取USER AGENT

  • Android RecyclerView添加FootView和HeadView

    前提概要: 上一篇文章已经介绍过了RecyclerView的基本使用方法,原文如下:android RecyclerView布局真的只是那么简单!此篇文章算是对RecyclerView更深使用的介绍. FootView和HeadView在ListView中的本身就有相对应的函数,但是在新潮的RecyclerView中却没有了,FootView在分页加载(上拉加载更多)中起着很重要的作用,因此也必须要学习一下了.(HeadView的添加与FootView的添加相比大致一样,在此就只讲FootVie

  • Android实现炫酷的CheckBox效果

    首先贴出实现的效果图: gif的效果可能有点过快,在真机上运行的效果会更好一些.我们主要的思路就是利用属性动画来动态地画出选中状态以及对勾的绘制过程.看到上面的效果图,相信大家都迫不及待地要跃跃欲试了,那就让我们开始吧. 自定义View的第一步:自定义属性. <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="SmoothChe

  • Android自定义View实现字母导航栏的代码

    思路分析: 1.自定义View实现字母导航栏 2.ListView实现联系人列表 3.字母导航栏滑动事件处理 4.字母导航栏与中间字母的联动 5.字母导航栏与ListView的联动 效果图: 首先,我们先甩出主布局文件,方便后面代码的说明 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/re

  • Android实现App中导航Tab栏悬浮的功能

    首先是"饿了么"导航Tab栏悬浮的效果图. 大家可以看到上图中的"分类"."排序"."筛选"会悬浮在app的顶部,状态随着ScrollView(也可能不是ScrollView,在这里姑且把这滑动的UI控件当作ScrollView吧)的滚动而变化.像这种导航Tab栏悬浮的作用相信大家都能体会到,Tab栏不会随着ScrollView等的滚动而被滑出屏幕外,增加了与用户之间的交互性和方便性. 看到上面的效果,相信大家都跃跃欲试了,那

  • Android RecyclerView添加上拉加载更多功能

    上一篇文章已经介绍了如何为RecyclerView添加FootView,在此基础上,要添加分页加载的功能其实已经很简单了. 上一篇文章地址:为RecyclerView添加FootView和HeadView 效果:(源码在文章结尾) 实现关键 在上一篇代码的基础上,只需要在onBindViewHolder(ViewHolder holder, int position)函数中添加一定修改就可以了,如下: @Override public void onBindViewHolder(ViewHold

  • Android获取手机通话记录的方法

    Android如何获取手机通话记录,本文为大家揭晓. 获取手机通话记录流程: 1. 获取ContentResolver; ContentResolver resolver = getContentResolver(); 2.resolver.query(*); 需要传入通话记录的URI:CallLog.Calls.CONTENT_URI 3.对查询得到的Cursor进行数据获取. 主要代码如下: MainActivity.java package com.noonecode.contentres

  • Android React-Native通信数据模型分析

    无论是计算机领域还是日常生活中,我们所言的通信,其核心都是数据信息的交换,而数据模型的优劣对通信效率有着决定性的作用. 在React-Native项目中,Javascript语言与Native两种语言(Java或OC等)间存在着大量的数据交换,也就是所谓的通信.众所周知,移动APP对性能的要求无比苛刻,如果通信数据模型设计地不合理,很可能引起多线程下的数据安全问题,以及应用性能问题,比如内存泄漏,UI绘制缓慢等. 前面几篇博客我们详细分析过React-Native的通信机制,主要有两个方向: J

随机推荐