android实时监控网络状态

android写BroadcastReceiver(广播)实时监控网络状态:下面是具体实现的代码。

<?xml version="1.0" encoding="utf-8"?>

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
	android:oneshot="false">
	<item android:duration="300" android:drawable="@drawable/wifi0" />
	<item android:duration="300" android:drawable="@drawable/wifi1" />
	<item android:duration="300" android:drawable="@drawable/wifi2" />
	<item android:duration="300" android:drawable="@drawable/wifi3" />

</animation-list>
<?xml version="1.0" encoding="utf-8"?>

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
	android:oneshot="false">
	<item android:duration="300" android:drawable="@drawable/ap1" />
	<item android:duration="300" android:drawable="@drawable/ap2" />
	<item android:duration="300" android:drawable="@drawable/ap3" />

</animation-list>
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:maxLevel="50" android:drawable="@drawable/wifi3" /> 
    <item android:maxLevel="70" android:drawable="@drawable/wifi2" /> 
    <item android:maxLevel="90" android:drawable="@drawable/wifi1" /> 
    <item android:maxLevel="100" android:drawable="@drawable/wifi0" /> 
</level-list>


以上三个XML,wifi_animation.xml和wifi_ap_animation.xml是用于wifi和wifi热点在连接的过程中调用,都是300毫秒加载一张图片。wifi_level.xml是显示wifi信号强度,小于50为信号最佳,50-70为良,70-90为差,90-100是最差。

<?xml version="1.0" encoding="utf-8"?>
<com.test.MainView xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/mianView"
    android:background="@drawable/background">
    
	<LinearLayout android:layout_width="wrap_content"
		          android:layout_height="wrap_content">
	    <ImageView  android:id="@+id/wifiConnecting"
				    android:layout_width="fill_parent" 
				    android:layout_height="wrap_content"/>	  
	    <ImageView  android:id="@+id/lanImage"
				    android:layout_width="fill_parent"
				    android:layout_height="wrap_content"/>  
	    <ImageView  android:id="@+id/wifiAP"
				    android:layout_width="fill_parent" 
				    android:layout_height="wrap_content"/>
		
	</LinearLayout>

<Button  android:id="@+id/mBut"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="Switching net"
         android:textColor="#FFFFFF"
         android:background="@drawable/button"
         android:layout_marginTop="50dip"
         android:layout_gravity="center"/>
      
         
</com.test.MainView>

 以下就是我们要现实的java代码。

package com.test;


import android.app.Activity;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class MainActivity extends Activity {
	private static final String TAG = "MainActivity";
	private MainView mMianView;
	private WifiEnabler wifiEnabler;
	private WifiApEnabler wifiApEnabler;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		mMianView = (MainView) findViewById(R.id.mianView);
         //实例WifiEnabler类
		wifiEnabler = new WifiEnabler(this, mHandler);
		//注册广播
		wifiEnabler.resume();
		
		wifiApEnabler = new WifiApEnabler(this, mHandler);
		wifiApEnabler.resume();
	}

	private Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			Log.i(TAG, "==============" + msg.what);
			switch (msg.what) {
			case 0:
				Log.i(TAG, "--------mHandler : 0----------");
				mMianView.openingWifi();
				break;
			case 1:
				Log.i(TAG, "--------mHandler : 1----------");
				break;
			case 2:
				Log.i(TAG, "--------mHandler : 2----------");
				break;
			case 3:
				Log.i(TAG, "--------mHandler : 3----------");
				mMianView.setWifiState(false, 0);
				break;
			case 4:
				Log.i(TAG, "--------mHandler : 4----------");
				mMianView.setEthernetState(false);
				break;
			case 5:
				Log.i(TAG, "--------mHandler : 5----------");
				mMianView.setEthernetState(true);
				
				break;
			case 6:
				Log.i(TAG, "--------mHandler : 6----------");
				int wifiLevel = Math.abs(((WifiManager) getSystemService(WIFI_SERVICE)).getConnectionInfo().getRssi());		
				mMianView.setWifiState(true, wifiLevel);
				
				break;
			case 7:
				Log.i(TAG, "--------mHandler : 7----------");
				mMianView.openingWifiAP();
				break;
			case 8:
				Log.i(TAG, "--------mHandler : 8----------");
				mMianView.setWifiAP(true);
				break;
			case 9:
				Log.i(TAG, "--------mHandler : 9----------");
				mMianView.setWifiAP(false);
				break;
			case 10:
				Log.i(TAG, "--------mHandler : 10----------");
				mMianView.setWifiAP(false);
				break;
			case 11:
				Log.i(TAG, "--------mHandler : 11----------");
				mMianView.setWifiAP(true);
				break;
			default:
				break;
			}
		}
	};

	@Override
	protected void onDestroy() {
		super.onDestroy();
		//注销广播
		if (wifiEnabler != null) {
			wifiEnabler.pause();
		}else if(wifiApEnabler != null){
			wifiApEnabler.pause();
		}
		
	}
}
package com.test;

import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.provider.Settings;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class MainView extends LinearLayout {
	private static final String TAG = "MainView";
	private ImageView wifiConnecting,wifiAP, mEthernetView;
	private Button mBut;
	private final AnimationDrawable wifiAnimation = (AnimationDrawable) getResources().getDrawable(R.drawable.wifi_animation);
	private final AnimationDrawable wifiAPAnimation = (AnimationDrawable) getResources().getDrawable(R.drawable.wifi_ap_animation);
	private Context mContext;

	public MainView(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.mContext = context;
	}

	@Override
	protected void onFinishInflate() {
		super.onFinishInflate();
		initLayout();
		
		boolean ethernetValid = true;
		String ethernet = android.os.SystemProperties.get("ro.ethernet.valid");
		if (ethernet!=null && ethernet.equals("false")){
			ethernetValid = false;
			mEthernetView.setVisibility(View.GONE);
		}
		WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
		int wifiLevel = Math.abs((wifiManager).getConnectionInfo().getRssi());		
		if(wifiManager.isWifiEnabled()){
			ConnectivityManager connManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
			if(!ethernetValid || wifiManager.isWifiEnabledInternal()){
				//wifi connected
				Log.i(TAG, "wifi ++++++++++++");
				NetworkInfo.State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
				if(NetworkInfo.State.CONNECTED==state){ 
					Log.i(TAG, "wifi connected");
					setWifiState(true,wifiLevel);
				}else{
					Log.i(TAG, "wifi ------------");
					setWifiState(false,0);
				}
			}else if(ethernetValid){
				//ethernet connected
				Log.i(TAG, "ethernet +++++++++++++");
				NetworkInfo.State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET).getState();
				if(NetworkInfo.State.CONNECTED==state){ 
					Log.i(TAG, "ethernet connected");
					setEthernetState(true);
				}else{
					Log.i(TAG, "ethernet -------------");
					setEthernetState(false);
				}
			}
		}

		mBut.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.i(TAG, "------Button----Switching network-------");
				mContext.startActivity(new Intent(
						Settings.ACTION_WIRELESS_SETTINGS));
			}

		});
		

	}

	private void initLayout() {
		wifiConnecting = (ImageView) findViewById(R.id.wifiConnecting);
		mEthernetView = (ImageView) findViewById(R.id.lanImage);
		wifiAP = (ImageView) findViewById(R.id.wifiAP);
		mBut = (Button) findViewById(R.id.mBut);
	}

	protected void setWifiState(boolean connect, int wifiLevel) {
		if (connect) {			
			wifiAnimation.stop();
			mEthernetView.setImageResource(R.drawable.lan_unconnect);	
		    Log.i(TAG, "---------setWifiState()  open--------" + wifiLevel);
			switch (wifiLevel) {
			case 0:
				Log.d(TAG, "------wifiLevel---------0-----"+wifiLevel);
				wifiConnecting.setImageResource(R.drawable.wifi_level);
				wifiConnecting.setImageLevel(wifiLevel);
				break;
			case 1:
				Log.d(TAG, "------wifiLevel----------1------"+wifiLevel);
				wifiConnecting.setImageResource(R.drawable.wifi_level);
				wifiConnecting.setImageLevel(wifiLevel);
				break;
			case 2:
				Log.d(TAG, "------wifiLevel--------2-------"+wifiLevel);
				wifiConnecting.setImageResource(R.drawable.wifi_level);
				wifiConnecting.setImageLevel(wifiLevel);
				break;
			case 3:
				Log.d(TAG, "------wifiLevel--------3-------"+wifiLevel);
				wifiConnecting.setImageResource(R.drawable.wifi_level);
				wifiConnecting.setImageLevel(wifiLevel);
				break;			
			default:				
				Log.d(TAG, "------wifiLevel---------4--------"+wifiLevel);
				wifiConnecting.setImageResource(R.drawable.wifi_level);
				wifiConnecting.setImageLevel(wifiLevel);
				break;
			}
			
			
		} else {			
			wifiAnimation.stop();
			wifiConnecting.setImageResource(R.drawable.wifi_unconnect);
			mEthernetView.setImageResource(R.drawable.lan_unconnect);
			Log.i(TAG, "---------setWifiState()  stop--------");
		}
	}

	protected void openingWifi() {
		wifiConnecting.setImageDrawable(wifiAnimation);
		wifiAnimation.start();
		mEthernetView.setImageResource(R.drawable.lan_unconnect);
	}
	
	protected void openingWifiAP() {
		wifiAP.setImageDrawable(wifiAPAnimation);
		wifiAP.setVisibility(View.VISIBLE);
		wifiAPAnimation.start();
	}
	
	
	protected void setWifiAP(boolean connect) {
		if(connect){
			wifiAPAnimation.stop();
			wifiAP.setVisibility(View.VISIBLE);
			wifiAP.setImageResource(R.drawable.ap3);
		}else{
			wifiAPAnimation.stop();
			wifiAP.setVisibility(View.GONE);
		}
	}

	protected void setEthernetState(boolean connect) {
		if (connect) {
			mEthernetView.setImageResource(R.drawable.lan_connected);
			wifiAnimation.stop();
			wifiConnecting.setImageResource(R.drawable.wifi_unconnect);
		} else {
			mEthernetView.setImageResource(R.drawable.lan_unconnect);
		}
	}

}
package com.test;

import java.util.ArrayList;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.Message;
 
public class WifiApEnabler {
    private final Context mContext;
    private Handler mHandler;
    private WifiManager mWifiManager;
    private final IntentFilter mIntentFilter;
 
    ConnectivityManager mCm;
    private String[] mWifiRegexs;
 
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (WifiManager.WIFI_AP_STATE_CHANGED_ACTION.equals(action)) {
                handleWifiApStateChanged(intent.getIntExtra(
                        WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_FAILED));
            } else if (ConnectivityManager.ACTION_TETHER_STATE_CHANGED.equals(action)) {
                ArrayList<String> available = intent.getStringArrayListExtra(
                        ConnectivityManager.EXTRA_AVAILABLE_TETHER);
                ArrayList<String> active = intent.getStringArrayListExtra(
                        ConnectivityManager.EXTRA_ACTIVE_TETHER);
                ArrayList<String> errored = intent.getStringArrayListExtra(
                        ConnectivityManager.EXTRA_ERRORED_TETHER);
                updateTetherState(available.toArray(), active.toArray(), errored.toArray());
            }
 
        }
    };
 
    public WifiApEnabler(Context context,Handler handler) {
        mContext = context;
        mHandler = handler;
       
        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        mCm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
 
        mWifiRegexs = mCm.getTetherableWifiRegexs();
 
        mIntentFilter = new IntentFilter(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
        mIntentFilter.addAction(ConnectivityManager.ACTION_TETHER_STATE_CHANGED);
    }
 
    public void resume() {
        mContext.registerReceiver(mReceiver, mIntentFilter);       
    }
 
    public void pause() {
        mContext.unregisterReceiver(mReceiver);
    }
 
    
    private void updateTetherState(Object[] available, Object[] tethered, Object[] errored) {
        boolean wifiTethered = false;
        boolean wifiErrored = false;
 
        for (Object o : tethered) {
            String s = (String)o;
            for (String regex : mWifiRegexs) {
                if (s.matches(regex)) wifiTethered = true;
            }
        }
        for (Object o: errored) {
            String s = (String)o;
            for (String regex : mWifiRegexs) {
                if (s.matches(regex)) wifiErrored = true;
            }
        }
 
        if (wifiTethered) {
            WifiConfiguration wifiConfig = mWifiManager.getWifiApConfiguration();
            Message msg = new Message();
        	msg.what = 11;
        	msg.obj = wifiConfig;
        	mHandler.sendMessage(msg);
        } else if (wifiErrored) {
        	mHandler.sendEmptyMessage(-1);
        }
    }

    

 
    private void handleWifiApStateChanged(int state) {
    	  switch (state) {
          case WifiManager.WIFI_STATE_ENABLING:
          	mHandler.sendEmptyMessage(7);
              break;
          case WifiManager.WIFI_STATE_ENABLED:
          	mHandler.sendEmptyMessage(8);
              break;
          case WifiManager.WIFI_STATE_DISABLING:
          	mHandler.sendEmptyMessage(9);
              break;
          case WifiManager.WIFI_STATE_DISABLED:
          	mHandler.sendEmptyMessage(10);
              break;
          default:
          	mHandler.sendEmptyMessage(-1);
      }
    }
}

/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.test;



import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.NetworkInfo;
import android.net.wifi.SupplicantState;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.ethernet.EthernetManager;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class WifiEnabler  {
    private final Context mContext; 
    private static final String TAG = "WifiEnabler";
    private final WifiManager mWifiManager;
    private EthernetManager mEthManager;
    private final IntentFilter mIntentFilter;
    private Handler mHandler;
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            Log.i("", "================>"+ action);
            if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
                handleWifiStateChanged(intent.getIntExtra(
                        WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN));
            } 
            else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
            	
                handleStateChanged(WifiInfo.getDetailedStateOf((SupplicantState)
                        intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)));
            } 
            else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
            	
                handleStateChanged(((NetworkInfo) intent.getParcelableExtra(
                        WifiManager.EXTRA_NETWORK_INFO)).getDetailedState());
            } 
            else if (EthernetManager.ETHERNET_ALLOWED_STATE_CHANGED_ACTION.equals(action)) {
            	
                handleEthStateChanged(intent.getIntExtra(
                        EthernetManager.EXTRA_ETHERNET_STATE, EthernetManager.ETHERNET_STATE_UNKNOWN));
            }
        }
    };

    public WifiEnabler(Context context,Handler handler) {
        mContext = context;
        mHandler = handler;
        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        mEthManager = (EthernetManager) context.getSystemService(Context.ETHERNET_SERVICE);
        mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
        mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
        mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        mIntentFilter.addAction(EthernetManager.ETHERNET_ALLOWED_STATE_CHANGED_ACTION);
    }

    public void resume() {
        mContext.registerReceiver(mReceiver, mIntentFilter);
    }
    
    public void pause() {
        mContext.unregisterReceiver(mReceiver);
    }
    
    
    private void handleWifiStateChanged(int state) {
        switch (state) {
            case WifiManager.WIFI_STATE_ENABLING:
            	mHandler.sendEmptyMessage(0);
                break;
            case WifiManager.WIFI_STATE_ENABLED:
            	mHandler.sendEmptyMessage(1);
                break;
            case WifiManager.WIFI_STATE_DISABLING:
            	mHandler.sendEmptyMessage(2);
                break;
            case WifiManager.WIFI_STATE_DISABLED:
            	mHandler.sendEmptyMessage(3);
                break;
            default:
            	mHandler.sendEmptyMessage(-1);
        }
    }

    private void handleEthStateChanged(int state) {
        if (state == EthernetManager.ETHERNET_STATE_DISABLED) {
        	mHandler.sendEmptyMessage(4);
        }else{
        	mHandler.sendEmptyMessage(5);
        }
        	
    }

    private void handleStateChanged(NetworkInfo.DetailedState state) {
        // WifiInfo is valid if and only if Wi-Fi is enabled.
        // Here we use the state of the check box as an optimization.
        if (state != null) {
            WifiInfo info = mWifiManager.getConnectionInfo();
            if (info != null) {
            	Message msg = new Message();
            	msg.what = 6;
            	msg.obj = info;
            	mHandler.sendMessage(msg);
            }
        }
    }


}

 实现的需求文档上截了个图片



 

猜你喜欢

转载自haiyang08101.iteye.com/blog/1682998