1、android网络连接的类型
2、判断网络是否连接
3、监听网络
4、网络有问题时提示用户设置网络
5、添加中国移动代理


1、android网络连接的类型

很多朋友在android开发中,都会遇到手机网络类型判断,因为就目前的android平台手机来说:可能会存在4中状态
      1.无网络(这种状态可能是因为手机停机,网络没有开启,信号不好等原因)
      2.使用WIFI上网
      3.CMWAP(中国移动代理)
      4.CMNET上网
 这四种状态,如果没有网络,肯定是无法请求Internet了,如果是wap就需要为手机添加中国移动代理,关于为手机添加中国移动的代理,请到
http://www.2cto.com/kf/201111/112100.html 这里写有关于添加中国移动代理的例子!
下面是网络判断的方法:

/**
 
      * @author sky
 
      * 获取当前的网络状态  -1:没有网络  1:WIFI网络2:wap网络3:net网络
 
      * @param context
 
      * @return
 
      */ 
 
     public static int getAPNType(Context context){ 
         int netType = -1;  
         ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
         NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 
         if(networkInfo==null){ 
             return netType; 
         } 
         int nType = networkInfo.getType(); 
         if(nType==ConnectivityManager.TYPE_MOBILE){ 
             Log.e("networkInfo.getExtraInfo()", "networkInfo.getExtraInfo() is "+networkInfo.getExtraInfo()); 
             if(networkInfo.getExtraInfo().toLowerCase().equals("cmnet")){ 
                 netType = CMNET; 
             } 
             else{ 
                 netType = CMWAP; 
             } 
         } 
         else if(nType==ConnectivityManager.TYPE_WIFI){ 
             netType = WIFI; 
         } 
         return netType; 
     }



2、判断网络是否连接

1)判断是否有网络连接

public boolean isNetworkConnected(Context context) {  
     if (context != null) {  
         ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
                 .getSystemService(Context.CONNECTIVITY_SERVICE);  
         NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();  
         if (mNetworkInfo != null) {  
             return mNetworkInfo.isAvailable();  
         }  
     }  
     return false;  
 }

2)判断WIFI网络是否可用

public boolean isWifiConnected(Context context) {  
     if (context != null) {  
         ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
                 .getSystemService(Context.CONNECTIVITY_SERVICE);  
         NetworkInfo mWiFiNetworkInfo = mConnectivityManager  
                 .getNetworkInfo(ConnectivityManager.TYPE_WIFI);  
         if (mWiFiNetworkInfo != null) {  
             return mWiFiNetworkInfo.isAvailable();  
         }  
     }  
     return false;  
 }

3)判断MOBILE网络是否可用

public boolean isMobileConnected(Context context) {  
     if (context != null) {  
         ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
                 .getSystemService(Context.CONNECTIVITY_SERVICE);  
         NetworkInfo mMobileNetworkInfo = mConnectivityManager  
                 .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);  
         if (mMobileNetworkInfo != null) {  
             return mMobileNetworkInfo.isAvailable();  
         }  
     }  
     return false;  
 }

4)获取当前网络连接的类型信息

public static int getConnectedType(Context context) {  
     if (context != null) {  
         ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
                 .getSystemService(Context.CONNECTIVITY_SERVICE);  
         NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();  
         if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {  
             return mNetworkInfo.getType();  
         }  
     }  
     return -1;  
 }



5)获取当前网络运营商


public static int getNetWorkType(Context context) {
		int netType = -1;

		TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
		String simOperator = manager.getSimOperator();
		if( simOperator != null ) {
			if( simOperator.startsWith("46000") || simOperator.startsWith("46002") ) {
				netType = NETTYPE_MOBILE;
			} else if(simOperator.startsWith("46001")) {
				netType = NETTYPE_UNICOM;
			} else if(simOperator.startsWith("46003")) {
				netType = NETTYPE_TELECOM;
			}
		}
		return netType;
	}



3、监听网络

在开发android应用时,涉及到要进行网络访问,时常需要进行网络状态的检查,以提供给用户必要的提醒。一般可以通过ConnectivityManager来完成该工作。
ConnectivityManager有四个主要任务:
1)、监听手机网络状态(包括GPRS,WIFI, UMTS等)
2)、手机状态发生改变时,发送广播
3)、当一个网络连接失败时进行故障切换
4)、为应用程序提供可以获取可用网络的高精度和粗糙的状态
当我们要在程序中监听网络状态时,只要一下几个步骤即可:

1)、定义一个Receiver重载其中的onReceive函数,在其中完成所需要的功能,如根据WIFI和GPRS是否断开来改变空间的外观

connectionReceiver = new BroadcastReceiver() {
   
   @Override
   public void onReceive(Context context, Intent intent) {
    ConnectivityManager connectMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo mobNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    NetworkInfo wifiNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

    if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
     Log.i(TAG, "unconnect");
     // unconnect network
     }else {

    // connect network
     }
   }
  };


2)、在适当的地方注册Receiver,可以在程序中注册,在onCreate中调用如下函数即可:


IntentFilter intentFilter = new IntentFilter();
  intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
  registerReceiver(connectionReceiver, intentFilter);



3、在适当时取消注册Receiver,可以在程序中取消,在onDestroye中调用如下函数即可:



if (connectionReceiver != null) {
   unregisterReceiver(connectionReceiver);
  }


Ps:网上还有很多关于使用TelephonyManager 的方法的,方法如下(但是我试了好几次都有问题,如每次第一次进入一个Activity时会自动收到网络断开的信号,每次网络状态改变时收到多次回调且状态不正确。不知道有什么要注意的地方,求指点!)


final TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  

mTelephonyMgr.listen(new PhoneStateListener(){

@Override

public void onDataConnectionStateChanged(int state) {
switch(state){
case TelephonyManager.DATA_DISCONNECTED://网络断开
break;
case TelephonyManager.DATA_CONNECTING://网络正在连接
break;
case TelephonyManager.DATA_CONNECTED://网络连接上
break;
}
}
}, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);

至于第二种方法,本人并没有去尝试过。第一种方式还是比较好用,如果要程序隐藏在后台的话,建议开个service,将BroadcastReceiver注册在service,但不要忘了取消注册。

在测试中遇到过这样的状况,将一个当前连接wifi的路由设备关闭,但是程序并没有捕捉到unconnect network,可能是因为手机设备立刻连接另一个路由设备了。



4、网络有问题时提示用户设置网络

由于Android的SDK版本不同所以里面的API和设置方式也是有少量变化的,尤其是在Android 3.0 及后面的版本,UI和显示方式也发生了变化,现在就以打开网络设置为例,同大家分享一下,效果如下:

android 有无移动网络 安卓的移动网络在哪里_android 有无移动网络

1). 首先先看一下Android 判断网络是否已打开(如果直接写在Activity里面,则可以不需要参数)

/*
     * 判断网络连接是否已开
     * 2012-08-20
     *true 已打开  false 未打开
     * */
    public static boolean isConn(Context context){
        boolean bisConnFlag=false;
        ConnectivityManager conManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo network = conManager.getActiveNetworkInfo();
        if(network!=null){
            bisConnFlag=conManager.getActiveNetworkInfo().isAvailable();
        }
        return bisConnFlag;
    }


2). 如果未开启网络调用打开设置界面(如果不写在Activity里面则不需要参数)

/*
     * 打开设置网络界面
     * */
    public static void setNetworkMethod(final Context context){
        //提示对话框
        AlertDialog.Builder builder=new Builder(context);
        builder.setTitle("网络设置提示").setMessage("网络连接不可用,是否进行设置?").setPositiveButton("设置", new DialogInterface.OnClickListener() {
            
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                Intent intent=null;
                //判断手机系统的版本  即API大于10 就是3.0或以上版本 
                if(android.os.Build.VERSION.SDK_INT>10){
                    intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS);
                }else{
                    intent = new Intent();
                    ComponentName component = new ComponentName("com.android.settings","com.android.settings.WirelessSettings");
                    intent.setComponent(component);
                    intent.setAction("android.intent.action.VIEW");
                }
                context.startActivity(intent);
            }
        }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
            
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                dialog.dismiss();
            }
        }).show();
    }


3).  在 AndroidManifest.xml中设置权限


<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>


4). 在相应的位置调用即可


if(!ConnectionUtil.isConn(getApplicationContext())){
            ConnectionUtil.setNetworkMethod(MainActivity.this);
        }

这样在软件开启时加上判断就可以先设置网络了。


5、添加中国移动代理

     在android中,一般需要联网的时候前,都要做一次网络的判断,判断当前的网络状态!然后开始请求网络
     当我们使用wap网络的时候,程序中必须要中国移动代理!这样的话,手机才能正常的访问internet!
     在android中,有两种方式请求网络:HttpURLConnection和HttpClient请求方式,如果网络状态为wap的时候,都要为两种请求添加中国移动代理的!
     第一种方式:HttpURLConnection


/**

 * @author sky

使用HttpURLConnection请求Internet

 * @param context   context对象

 * @param requestUrl  请求的URL

 * @param param   请求的参数

 * @return  返回一个inputstream流

 */ 

public static InputStream getHttpURLConnectionInputStream(Context context,String requestUrl,Map<String, String> param) { 

     

    URL url; 

    HttpURLConnection conn = null; 

    InputStream input = null; 

    try { 

        url = new URL(requestUrl); 

        if(getAPNType(context)==NetWorkUtil.CMWAP)   //当请求的网络为wap的时候,就需要添加中国移动代理 

        { 

            Proxy proxy = new Proxy(java.net.Proxy.Type.HTTP,new InetSocketAddress("10.0.0.172", 80)); 

            conn = (HttpURLConnection) url.openConnection(proxy); 

        } 

            conn = (HttpURLConnection) url.openConnection(); 

         

            conn.setConnectTimeout(10000);    //请求超时 

            conn.setRequestMethod("POST");  //请求方式 

            conn.setReadTimeout(1000);   //读取超时 

            conn.setDoOutput(true); 

            conn.setDoInput(true); 

            conn.setUseCaches(false); 

            conn.setRequestProperty("Charset", "UTF-8"); 

            conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); 

            OutputStream os = conn.getOutputStream();     

            StringBuilder sb = new StringBuilder(); 

            Iterator<String> it = param.keySet().iterator(); 

            while (it.hasNext()) { 

                String key = it.next(); 

                String value = param.get(key); 

                sb.append(key).append("=").append(value).append("&"); 

            } 

            String p = sb.toString().substring(0, sb.length()-1); 

            System.out.println("请求的参数"+p); 

            os.write(p.getBytes("utf-8")); 

            os.close(); 

            if(conn!=null) 

            { 

                input = conn.getInputStream(); 

            } 

         

    } catch (Exception e) { 

        e.printStackTrace(); 

    } 

    return input; 

}

上面这种方式就是HttpURLConnection ,这种方式在android开发中也是比较常用的,希望朋友们也要熟悉的掌握!


       第二种方式:HttpClient


/**

 * @author sky

使用HttpURLConnection请求Internet

 * @param context   context对象

 * @param requestUrl  请求的URL

 * @param param   请求的参数

 * @return  返回一个inputstream流

 */ 

public static InputStream getHttpClientInputStream(Context context,String requestUrl, Map<String, String> param)throws Exception { 

    HttpClient client = new DefaultHttpClient(); 

    if(getAPNType(context)==NetWorkUtil.CMWAP)  //当请求的网络为wap的时候,就需要添加中国移动代理 

    {  

        HttpHost proxy = new HttpHost("10.0.0.172", 80); 

        client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, 

                proxy); 

    }  www.2cto.com

    HttpPost hp = new HttpPost(requestUrl); 

    hp.setHeader("Charset", "UTF-8"); 

    hp.setHeader("Content-Type", "application/x-www-form-urlencoded"); 

    List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>(); 

     

    Iterator<String> it = param.keySet().iterator(); 

    while (it.hasNext()) { 

        String key = it.next(); 

        list.add(new BasicNameValuePair(key, param.get(key))); 

    } 

    hp.setEntity(new UrlEncodedFormEntity(list,"UTF-8")); 

    HttpResponse response = null; 

    response = client.execute(hp); 

    return response.getEntity().getContent(); 

}

      这个httpClient实现了android内置的DefaultHttpClient,所以使用起来还是很方便的!


      但是我发现HttpClient 比HttpURLConnection 要好一些,因为HttpURLConnection 如果使用wap在上网请求的时候,存在很多问题的(我是深有体会的,比如请求无响应,信号不好都可能造成一些未知的错误)


     好了,熟悉掌握了两种请求方式了,android的联网应用就可以开发了!呵呵




参考资料:
android为HttpClient和HttpURLConnection添加中国移动代理