您的位置:首页 > 其它

一个测试WIFI的activity

2013-09-09 23:33 211 查看
在手机跟平板的生产中,除了工厂模式测试PCBA之外,工程模式也是整机测试中很有必要的。通常的做法就是用拨号键拨入一串操作码,发出一个Intent,测试APK中接收这个intent后,启动调用apk的acitivity就可以了。这里说明测试WIFI的activity的大致实现过程。

(1)在工程的AndroidManifest.xml中加上对WIFI的权限申明,否则不让访问

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>

(2)页面上放入两个textview控件,第一个控件提示WIFI测试过程,以及以List的形式显示搜索到的WIFI scan result结果;第二个控件提示测试结果是PASS或者FAIL。思路就是启动一个WIFI搜索的线程,里面要分别进行获取WIFI服务、使能WIFI、WIFI扫描、获取WIFI信息、异常和失败处理。检测成功的路径是注册了一个WifiReceiver在收到SCAN_RESULTS_***AILABLE_ACTION这个intent时显示扫描结果并结束线程。

需要用到的import类

import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.view.View;
import android.net.wifi.WifiManager;  
import android.net.wifi.ScanResult;
import android.content.BroadcastReceiver;
import android.util.Log;
import java.util.List;
import android.net.wifi.WifiInfo;

该activity类的开头要定义若干所需变量

private TextView mMainView, mTV;
	private WifiManager mWifiManager = null; 
	private boolean mWifiEnabled = false;     	//WIFI是否使能
	WifiReceiver mReceiverWifi = null;   	//自定义WIFI receiver变量
	List<ScanResult> mWifiList;			//以List回显ScanResult的变量
	StringBuilder mSb = new StringBuilder();	//存储WIFI回显的STRING
	private final int WAIT_TIMEOUT_S = 30;
	private int mFlag = -1;			//WIFI线程运行时的状态标志
	static int mCount = 0;
	private  String strEnableWifi = "";
	private  String strScanningWifi = "";
	private  String strSuccess = "";
	private  String strFaild = "";
	private  String cannotgetwifiservice = "";
	private  String cannotgetwifistate = "";
	private  String wifistateunknown = "";	
	private boolean mTestResult = false;		//WIFI测试的结果

onCreate的主要内容

super.onCreate(savedInstanceState);
		setContentView(R.layout.led);
		mTV = (TextView)findViewById(R.id.test);
		mMainView = (TextView)findViewById(R.id.testinfo);
		mFlag = -1;   	//WIFI扫描的初始化状态
		mCount = 0;

		strEnableWifi = getString(R.string.WIFI_enable_wifi).toString();
		strScanningWifi = getString(R.string.WIFI_scanning_wifi).toString();
		strSuccess = getString(R.string.Success).toString();
		strFaild = getString(R.string.Fail).toString();
		cannotgetwifiservice = getString(R.string.cannotgetwifiservice).toString();
		cannotgetwifistate = getString(R.string.cannotgetwifistate).toString();
		wifistateunknown = getString(R.string.wifistateunknown).toString();

		mReceiverWifi = new WifiReceiver();	//新建一个WifiReceiver变量,并用IntentFilter跟SCAN_RESULTS_***AILABLE_ACTION绑定
		registerReceiver(mReceiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_***AILABLE_ACTION));

		try{
			mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
			mSb.append(strEnableWifi + " ... ");
			mMainView.setText(mSb);
			mFlag = 1;	//获得WIFI系统服务
			mHandler.postDelayed(task, 200);
		}catch(Exception   e) {
			Log.e(TAG, e.toString());
			mMainView.setText(strFaild + ":" + cannotgetwifiservice);
			mFlag = 0;	//线程退出标志
			mHandler.postDelayed(task, 2000);
		}

自定义的WIFI receiver实现

class WifiReceiver extends BroadcastReceiver {
        public void onReceive(Context c, Intent intent) {
            		mHandler.removeCallbacks(task);	//搜到结果就结束线程
            		mWifiList = mWifiManager.getScanResults();

			if (mWifiList == null || mWifiList.size() < 1) {
				String strWifiScanNoHotspot = getString(R.string.WIFI_scan_no_hotspot).toString();
				 mMainView.setText(strWifiScanNoHotspot);
			} else {
		            	for (int i = 0; i < mWifiList.size(); i++) {
		                		mSb.append(new Integer(i + 1).toString() + ".");
		                		mSb.append((mWifiList.get(i)).toString());
		                		mSb.append("\n");		//存储一系列搜到的WIFI SSID等详细信息
		            	}
				for (ScanResult result : mWifiList){
					if(result.level >= -80){
						mTestResult = true;	//信号强度大于-80db,就PASS
						mTV.setText("PASS");
					}
				}
			   	mMainView.setText(mSb);	//显示ScanResult等消息WIFI INFO
			}
	}
}

线程退出函数:

private void destroy(int res)
	{
		 mHandler.removeCallbacks(task);		 
		 if(mReceiverWifi != null){
		 	unregisterReceiver(mReceiverWifi);	//注销掉WifiReceiver
			mReceiverWifi = null;
		 }
		Intent mIntent = new Intent();
		setResult(res, mIntent);
		finish();
	}

WIFI的scan线程

private Handler mHandler = new Handler();
	private Runnable task = new Runnable() {
		public void run() {
			Log.e(TAG, "run");
			int wifiState;
			switch(mFlag){
				case 0:	//EXIT
					destroy(-1);
					break;
				case 1://enable wifi
					try{
						wifiState = mWifiManager.getWifiState();
					}catch(Exception   e) {
						Log.e(TAG, e.toString());
						mMainView.setText(strFaild + ":" + cannotgetwifistate);
						mFlag = 0;
						mHandler.postDelayed(task, 2000);
						break;
					}
					
					Log.w(TAG, "getWifiState wifiState=" + wifiState);
					if (wifiState == WifiManager.WIFI_STATE_ENABLED) {										Log.d(TAG, "WIFI is already enabled");
						mWifiEnabled = true;	//WIFI使能OK
						mFlag = 3;//start scan
						mHandler.postDelayed(task, 200);
					} else if(wifiState == WifiManager.WIFI_STATE_DISABLED || wifiState == WifiManager.WIFI_STATE_ENABLING) {
						Log.d(TAG, "Turning wifi on...");
						if (wifiState == WifiManager.WIFI_STATE_DISABLED){
							try{
								mWifiManager.setWifiEnabled(true);	//使能WIFI
							}catch(Exception   e) {
								Log.e(TAG, e.toString());
								mMainView.setText(strEnableWifi + " ... " + strFaild + "\n");
								mFlag = 0;
								mHandler.postDelayed(task, 2000);
								break;
							}
							mFlag = 2;//start scan
							mHandler.postDelayed(task, 1000);
						}
					} else {
						Log.d(TAG, "WIFI Service is unreachable");
						mFlag = 2;//start scan
						mHandler.postDelayed(task, 1000);
					}
					break;
				case 2://get wifi state for 30 times
					mCount ++;
					if(mCount < WAIT_TIMEOUT_S){
						try{
							wifiState = mWifiManager.getWifiState();
						}catch(Exception   e){
							Log.e(TAG, e.toString());
							mMainView.setText(strFaild + ":" + cannotgetwifistate);
							mFlag = 0;
							mHandler.postDelayed(task, 2000);
							break;
						}

						if(wifiState == WifiManager.WIFI_STATE_ENABLED) {
							Log.w(TAG, "Turning wifi on Success.");
							mWifiEnabled = true;
							mFlag = 3;
							mHandler.postDelayed(task, 200);
						} else if (wifiState == WifiManager.WIFI_STATE_UNKNOWN) {  
					       	Log.w(TAG, "Turning wifi on failed.");
							mMainView.setText(strEnableWifi + " ... "  + (WAIT_TIMEOUT_S -mCount) );
							mFlag = 2;
							mHandler.postDelayed(task, 1000);
						}
					}else{
						mSb.append(strFaild + "\n");
						mMainView.setText(mSb);
						mFlag = 0;//exit
						mHandler.postDelayed(task, 2000);
					}
					break;
				case 3://start scan
					if (mWifiEnabled == true) {
						mSb.append(strSuccess + "\n\n");
						mSb.append(strScanningWifi + " ... \n");
						mMainView.setText(mSb);

						mWifiManager.startScan();
						mFlag = 4;
						mHandler.postDelayed(task, 30 * 1000);	//30秒内还没有结果就跳到case4
					} else {
						mSb.append(strFaild + "\n");
						mMainView.setText(mSb);
						mFlag = 0;//exit
						mHandler.postDelayed(task, 1000);
					}
					break;
				case 4:
					String strWifiScanTimeout = getString(R.string.WIFI_scan_timeout).toString();
					mSb.append(strWifiScanTimeout + "\n\n");
					mMainView.setText(mSb);
					mFlag = 0;//exit
					mHandler.postDelayed(task, 1000);
					break;
				default:
					break;
			}
					
		}
	};

以上就是主要过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: