Android之高仿飛鴿傳輸熱點建立與搜索模塊

這兩天,無心中看到飛鴿傳書的wifi熱點建立與搜索模塊,因而乎很蛋疼的還原了一下他的這一小模塊代碼,感受效果差很少,跟你們分享一下:java

源碼下載地址:http://download.csdn.net/download/weidi1989/5293352android


咱們先來看看效果圖:網絡

1.山寨機主界面app

2.進應用就會自動搜索wifi,這個動畫效果截屏變形了。將就一下吧
ide

3.搜索結果顯示
函數

4.鏈接上我另一臺山寨機建立的熱點
學習

5.正在建立熱點
動畫

6.熱點建立成功,關於那個黑黑的gif動畫,我試了三種方法:①.網上導了那個很氾濫的包,不行,②.用Movie實現的動畫,仍是不行,在有的機器上會花屏,③.就是下面這個效果了,自定義的一個view,因爲圖片是透明的,因此黑色底沒有解決。
ui

          

下面是幾個關鍵類的代碼:this

1.咱們先來看看這個廣播:WTBroadcast,經過這個廣播,能夠及時更新咱們的界面顯示信息。重點是「android.net.wifi.WIFI_STATE_CHANGED」 與「android.net.wifi.STATE_CHANGE」兩個狀態的區別

/**
 * wifi狀態監聽廣播
 * 
 * @author way
 * 
 */
public class WTBroadcast extends BroadcastReceiver {
	public static ArrayList<EventHandler> ehList = new ArrayList();

	public void onReceive(Context paramContext, Intent paramIntent) {
		if (paramIntent.getAction().equals("android.net.wifi.SCAN_RESULTS")) {
			// 搜索到wifi熱點結果廣播
			Log.i("WTScanResults", "android.net.wifi.SCAN_RESULTS");
			// 遍歷通知各個監聽接口
			for (int j = 0; j < ehList.size(); j++)
				((EventHandler) ehList.get(j)).scanResultsAvailable();
		} else if (paramIntent.getAction().equals(
				"android.net.wifi.WIFI_STATE_CHANGED")) {
			// wifi打開或關閉廣播(不須要鏈接上一個SSID)
			Log.e("WTScanResults", "android.net.wifi.WIFI_STATE_CHANGED");
			for (int j = 0; j < ehList.size(); j++)
				((EventHandler) ehList.get(j)).wifiStatusNotification();
		} else if (paramIntent.getAction().equals(
				"android.net.wifi.STATE_CHANGE")) {
			// 鏈接上一個SSID後發出的廣播,與android.net.wifi.WIFI_STATE_CHANGED有必定區別
			Log.e("WTScanResults", "android.net.wifi.STATE_CHANGE");
			for (int i = 0; i < ehList.size(); i++)
				((EventHandler) ehList.get(i)).handleConnectChange();
		}
	}

	/**
	 * 用來更新的接口
	 * 
	 * @author way
	 * 
	 */
	public static abstract interface EventHandler {
		public abstract void handleConnectChange();

		public abstract void scanResultsAvailable();

		public abstract void wifiStatusNotification();
	}
}


2.接下來是主Activity了:WTActivity,在這個Activity中,咱們來處理各類界面事件,同時根據wifi狀態變化,動態更新界面,值得學習的是自定義view和handler事件處理,還有超時線程的理論。內容比較多,我把它綜合到一個類中,其實能夠把一些經常使用的函數放在Application類中。

/**
 * 主Activity
 * 
 * @author way
 * 
 */
public class WTActivity extends Activity implements WTBroadcast.EventHandler {
	public static final int m_nWTSearchTimeOut = 0;// 搜索超時
	public static final int m_nWTScanResult = 1;// 搜索到wifi返回結果
	public static final int m_nWTConnectResult = 2;// 鏈接上wifi熱點
	public static final int m_nCreateAPResult = 3;// 建立熱點結果
	public static final int m_nUserResult = 4;// 用戶上線人數更新命令(待定)
	public static final int m_nWTConnected = 5;// 點擊鏈接後斷開wifi,3.5秒後刷新adapter
	public static final String PACKAGE_NAME = "com.way.wifi";
	public static final String FIRST_OPEN_KEY = "version";
	public static final String WIFI_AP_HEADER = "way_";
	public static final String WIFI_AP_PASSWORD = "way12345";

	private WTSearchAnimationFrameLayout m_FrameLWTSearchAnimation;
	private LinearLayout m_LinearLDialog;
	private LinearLayout m_LinearLIntroduction;
	private Button m_btnBack;
	private Button m_btnCancelDialog;
	private Button m_btnConfirmDialog;
	private Button m_btnCreateWT;
	private Button m_btnSearchWT;
	private GifView m_gifRadar;
	private boolean m_isFirstOpen = true;
	private LinearLayout m_linearLCreateAP;
	private ListView m_listVWT;
	ArrayList<ScanResult> m_listWifi = new ArrayList();
	private ProgressBar m_progBarCreatingAP;
	private TextView m_textVContentDialog;
	private TextView m_textVPromptAP;
	private TextView m_textVWTPrompt;
	private WifiAdmin m_wiFiAdmin;
	private CreateAPProcess m_createAPProcess;
	private WTSearchProcess m_wtSearchProcess;
	private int wTOperateEnum = WTOperateEnum.NOTHING;
	private WTAdapter m_wTAdapter;

	public Handler handler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case m_nWTSearchTimeOut://wifi搜索超時處理
				m_wtSearchProcess.stop();
				m_FrameLWTSearchAnimation.stopAnimation();
				m_listWifi.clear();
				m_textVWTPrompt.setVisibility(View.VISIBLE);
				m_textVWTPrompt.setText(R.string.wt_list_empty);
				break;
			case m_nWTScanResult://搜索到可鏈接wifi
				m_listWifi.clear();
				int size = m_wiFiAdmin.mWifiManager.getScanResults().size();
				if (size > 0) {
					for (int i = 0; i < size; ++i) {
						ScanResult scanResult = m_wiFiAdmin.mWifiManager
								.getScanResults().get(i);
						// Log.i("way", "SSID = " + scanResult.SSID);
						if (scanResult.SSID.startsWith(WIFI_AP_HEADER)) {
							m_listWifi.add(scanResult);
						}
					}
					if (m_listWifi.size() > 0) {
						m_wtSearchProcess.stop();
						m_FrameLWTSearchAnimation.stopAnimation();
						m_textVWTPrompt.setVisibility(View.GONE);
						m_wTAdapter.setData(m_listWifi);
						m_wTAdapter.notifyDataSetChanged();
					}
				}
				break;
			case m_nWTConnectResult://鏈接上一個熱點更新一下狀態
				m_wTAdapter.notifyDataSetChanged();
				break;
			case m_nCreateAPResult://建立熱點結果
				m_createAPProcess.stop();
				m_progBarCreatingAP.setVisibility(View.GONE);
				if (((m_wiFiAdmin.getWifiApState() == 3) || (m_wiFiAdmin
						.getWifiApState() == 13))
						&& (m_wiFiAdmin.getApSSID().startsWith(WIFI_AP_HEADER))) {
					m_textVWTPrompt.setVisibility(View.GONE);
					m_linearLCreateAP.setVisibility(View.VISIBLE);
					m_btnCreateWT.setVisibility(View.VISIBLE);
					m_gifRadar.setVisibility(View.VISIBLE);
					m_btnCreateWT.setBackgroundResource(R.drawable.x_ap_close);
					m_textVPromptAP
							.setText(getString(R.string.pre_wt_connect_ok)
									+ getString(R.string.middle_wt_connect_ok)
									+ m_wiFiAdmin.getApSSID()
									+ getString(R.string.suf_wt_connect_ok));
				} else {
					m_btnCreateWT.setVisibility(View.VISIBLE);
					m_btnCreateWT.setBackgroundResource(R.drawable.x_wt_create);
					m_textVPromptAP.setText(R.string.create_ap_fail);
				}
				break;
			case m_nUserResult:
				// 更新用戶上線人數,待定
				break;
			case m_nWTConnected://點擊鏈接熱點超時處理
				m_wTAdapter.notifyDataSetChanged();
				break;
			default:
				break;
			}
		}
	};
	
	/**
	 * 獲取共享熱點狀態
	 * @return 是否開啓共享
	 */
	public boolean getWifiApState() {
		try {
			WifiManager localWifiManager = (WifiManager) getSystemService("wifi");
			int i = ((Integer) localWifiManager.getClass()
					.getMethod("getWifiApState", new Class[0])
					.invoke(localWifiManager, new Object[0])).intValue();
			return (3 == i) || (13 == i);
		} catch (Exception localException) {
		}
		return false;
	}
	/**
	 * 是否鏈接上wifi
	 * @return
	 */
	public boolean isWifiConnect() {
		boolean isConnect = true;
		if (!((ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE))
				.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected())
			isConnect = false;
		return isConnect;
	}

	/**
	 *  是否爲第一次打開應用,根據版本判斷會比較好,由於商業應用會執行自動更新,
	 * @return
	 */
	private boolean isFirstOpen() {
		try {
			PackageInfo info = getPackageManager().getPackageInfo(PACKAGE_NAME,
					0);
			int currentVersion = info.versionCode;
			SharedPreferences prefs = PreferenceManager
					.getDefaultSharedPreferences(this);
			int lastVersion = prefs.getInt(FIRST_OPEN_KEY, 0);
			if (currentVersion > lastVersion) {
				prefs.edit().putInt(FIRST_OPEN_KEY, currentVersion).commit();
				return true;
			}
		} catch (PackageManager.NameNotFoundException e) {
			Log.w("way", e);
		}
		return false;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.wt_main);
		m_wtSearchProcess = new WTSearchProcess();
		m_createAPProcess = new CreateAPProcess();
		m_wiFiAdmin = WifiAdmin.getInstance(this);
		initView();
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		if (!m_isFirstOpen)
			init();//若是不是第一次打開應用,就執行更新
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		WTBroadcast.ehList.remove(this);
	}

	// 初始化view
	private void initView() {
		m_isFirstOpen = isFirstOpen();//是否第一次開啓應用
		m_LinearLIntroduction = ((LinearLayout) findViewById(R.id.introduction_layout_wt_main));// 介紹使用的view
		m_LinearLIntroduction.setOnClickListener(new OnClickListener() {
			public void onClick(View paramView) {
				m_LinearLIntroduction.setVisibility(View.GONE);
				init();
			}

		});

		m_btnBack = ((Button) findViewById(R.id.back_btn_wt_main));// 返回鍵
		m_btnBack.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				onBackPressed();
			}
		});

		m_linearLCreateAP = ((LinearLayout) findViewById(R.id.create_ap_llayout_wt_main));// 建立熱點的view
		m_progBarCreatingAP = ((ProgressBar) findViewById(R.id.creating_progressBar_wt_main));// 建立熱點的進度條
		m_textVPromptAP = ((TextView) findViewById(R.id.prompt_ap_text_wt_main));//建立熱點的那個提醒textView
		m_btnSearchWT = ((Button) findViewById(R.id.search_btn_wt_main));// 搜索熱點按鈕
		m_btnSearchWT.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub

				if (!m_wtSearchProcess.running) {// 若是搜索線程沒有啓動
					if (m_wiFiAdmin.getWifiApState() == 13
							|| m_wiFiAdmin.getWifiApState() == 3) {
						wTOperateEnum = WTOperateEnum.SEARCH;
						m_LinearLDialog.setVisibility(View.VISIBLE);
						m_textVContentDialog.setText(R.string.opened_ap_prompt);
						return;
					}
					if (!m_wiFiAdmin.mWifiManager.isWifiEnabled()) {// 若是wifi打開着的
						m_wiFiAdmin.OpenWifi();
					}
					m_textVWTPrompt.setVisibility(View.VISIBLE);
					m_textVWTPrompt.setText(R.string.wt_searching);
					m_linearLCreateAP.setVisibility(View.GONE);
					m_gifRadar.setVisibility(View.GONE);
					m_btnCreateWT.setBackgroundResource(R.drawable.x_wt_create);
					m_wiFiAdmin.startScan();
					m_wtSearchProcess.start();
					m_FrameLWTSearchAnimation.startAnimation();
				} else {
					// 從新啓動一下或者乾脆return掉
					m_wtSearchProcess.stop();
					m_wiFiAdmin.startScan();
					m_wtSearchProcess.start();
				}
			}
		});
		m_btnCreateWT = ((Button) findViewById(R.id.create_btn_wt_main));// 建立熱點的按鈕
		m_btnCreateWT.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if (m_wiFiAdmin.getWifiApState() == 4) {//若是不支持熱點建立
					Toast.makeText(getApplicationContext(),
							R.string.not_create_ap, Toast.LENGTH_SHORT).show();
					return;
				}
				if (m_wiFiAdmin.mWifiManager.isWifiEnabled()) {//若是wifi正打開着的,就提醒用戶
					wTOperateEnum = WTOperateEnum.CREATE;
					m_LinearLDialog.setVisibility(View.VISIBLE);
					m_textVContentDialog.setText(R.string.close_wifi_prompt);
					return;
				}

				if (((m_wiFiAdmin.getWifiApState() == 3) || (m_wiFiAdmin
						.getWifiApState() == 13))
						&& (!m_wiFiAdmin.getApSSID().startsWith(WIFI_AP_HEADER))) {//若是已經存在一個其餘的共享熱點
					wTOperateEnum = WTOperateEnum.CREATE;
					m_LinearLDialog.setVisibility(View.VISIBLE);
					m_textVContentDialog.setText(R.string.ap_used);
					return;
				}
				if (((m_wiFiAdmin.getWifiApState() == 3) || (m_wiFiAdmin
						.getWifiApState() == 13))
						&& (m_wiFiAdmin.getApSSID().startsWith(WIFI_AP_HEADER))) {//若是存在一個同名的共享熱點
					wTOperateEnum = WTOperateEnum.CLOSE;
					m_LinearLDialog.setVisibility(View.VISIBLE);
					m_textVContentDialog.setText(R.string.close_ap_prompt);
					return;
				}
				if (m_wtSearchProcess.running) {//若是正在搜索狀態
					m_wtSearchProcess.stop();
					m_FrameLWTSearchAnimation.stopAnimation();
				}
				m_wiFiAdmin.closeWifi();
				m_wiFiAdmin.createWiFiAP(m_wiFiAdmin.createWifiInfo(
						WIFI_AP_HEADER + getLocalHostName(), WIFI_AP_PASSWORD,
						3, "ap"), true);
				m_createAPProcess.start();
				m_listWifi.clear();
				m_wTAdapter.setData(m_listWifi);
				m_wTAdapter.notifyDataSetChanged();
				m_linearLCreateAP.setVisibility(View.VISIBLE);
				m_progBarCreatingAP.setVisibility(View.VISIBLE);
				m_btnCreateWT.setVisibility(View.GONE);
				m_textVWTPrompt.setVisibility(View.GONE);
				m_textVPromptAP.setText(getString(R.string.creating_ap));
			}
		});
		m_FrameLWTSearchAnimation = ((WTSearchAnimationFrameLayout) findViewById(R.id.search_animation_wt_main));// 搜索時的動畫
		m_listVWT = ((ListView) findViewById(R.id.wt_list_wt_main));// 搜索到的熱點listView
		m_wTAdapter = new WTAdapter(this, m_listWifi);
		m_listVWT.setAdapter(m_wTAdapter);

		m_textVWTPrompt = (TextView) findViewById(R.id.wt_prompt_wt_main);//搜索時提醒的textView
		m_gifRadar = (GifView) findViewById(R.id.radar_gif_wt_main);//建立熱點後的gif動畫View

		m_LinearLDialog = (LinearLayout) findViewById(R.id.dialog_layout_wt_main);//與用戶交互的對話框
		m_textVContentDialog = (TextView) findViewById(R.id.content_text_wtdialog);
		m_btnConfirmDialog = (Button) findViewById(R.id.confirm_btn_wtdialog);
		m_btnCancelDialog = (Button) findViewById(R.id.cancel_btn_wtdialog);
		// 彈出對話框的確認按鈕事件
		m_btnConfirmDialog.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				m_LinearLDialog.setVisibility(View.GONE);
				switch (wTOperateEnum) {
				case WTOperateEnum.CLOSE://若是是執行關閉熱點事件
					m_textVWTPrompt.setVisibility(View.VISIBLE);
					m_textVWTPrompt.setText("");
					m_linearLCreateAP.setVisibility(View.GONE);
					m_btnCreateWT.setBackgroundResource(R.drawable.x_wt_create);
					m_gifRadar.setVisibility(View.GONE);
					m_wiFiAdmin.createWiFiAP(m_wiFiAdmin.createWifiInfo(
							m_wiFiAdmin.getApSSID(), "81028066", 3, "ap"),
							false);

					m_wiFiAdmin.OpenWifi();//關閉熱點後從新開啓一下wifi
					m_wtSearchProcess.start();
					m_wiFiAdmin.startScan();
					m_FrameLWTSearchAnimation.startAnimation();
					m_textVWTPrompt.setVisibility(View.VISIBLE);
					m_textVWTPrompt.setText(R.string.wt_searching);
					m_linearLCreateAP.setVisibility(View.GONE);
					m_btnCreateWT.setBackgroundResource(R.drawable.x_wt_create);
					break;
				case WTOperateEnum.CREATE://若是是執行建立熱點事件
					if (m_wtSearchProcess.running) {
						m_wtSearchProcess.stop();
						m_FrameLWTSearchAnimation.stopAnimation();
					}
					m_wiFiAdmin.closeWifi();
					m_wiFiAdmin.createWiFiAP(m_wiFiAdmin.createWifiInfo(
							WIFI_AP_HEADER + getLocalHostName(),
							WIFI_AP_PASSWORD, 3, "ap"), true);
					m_createAPProcess.start();
					m_listWifi.clear();
					m_wTAdapter.setData(m_listWifi);
					m_wTAdapter.notifyDataSetChanged();
					m_linearLCreateAP.setVisibility(View.VISIBLE);
					m_progBarCreatingAP.setVisibility(View.VISIBLE);
					m_btnCreateWT.setVisibility(View.GONE);
					m_textVWTPrompt.setVisibility(View.GONE);
					m_textVPromptAP.setText(getString(R.string.creating_ap));
					break;
				case WTOperateEnum.SEARCH://若是是執行搜索wifi事件
					m_textVWTPrompt.setVisibility(View.VISIBLE);
					m_textVWTPrompt.setText(R.string.wt_searching);
					m_linearLCreateAP.setVisibility(View.GONE);
					m_btnCreateWT.setVisibility(View.VISIBLE);
					m_btnCreateWT.setBackgroundResource(R.drawable.x_wt_create);
					m_gifRadar.setVisibility(View.GONE);
					if (m_createAPProcess.running)
						m_createAPProcess.stop();
					m_wiFiAdmin.createWiFiAP(
							m_wiFiAdmin.createWifiInfo(m_wiFiAdmin.getApSSID(),
									WIFI_AP_PASSWORD, 3, "ap"), false);
					m_wiFiAdmin.OpenWifi();
					m_wtSearchProcess.start();
					m_FrameLWTSearchAnimation.startAnimation();
					break;
				default:
					break;
				}

			}
		});
		// 彈出對話框取消按鈕事件
		m_btnCancelDialog.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				m_LinearLDialog.setVisibility(View.GONE);
			}
		});

		WTBroadcast.ehList.add(this);// 注意監聽廣播,
		if (m_isFirstOpen)//若是是第一次開啓應用,打開幫助提示
			m_LinearLIntroduction.setVisibility(View.VISIBLE);
	}
	
	/**
	 * 獲取手機信息
	 * @return
	 */
	public String getLocalHostName() {
		String str1 = Build.BRAND;
		String str2 = Build.MODEL;
		if (-1 == str2.toUpperCase().indexOf(str1.toUpperCase()))
			str2 = str1 + "_" + str2;
		return str2;
	}

	/**
	 *  初始化
	 */
	private void init() {
		// TODO Auto-generated method stub
		if ((this.m_wtSearchProcess.running)
				|| (this.m_createAPProcess.running))
			return;
		//只有如下三種狀況
		if (!isWifiConnect() && !getWifiApState()) {//沒有建立熱點也沒有打開wifi
			m_wiFiAdmin.OpenWifi();
			m_wtSearchProcess.start();
			m_wiFiAdmin.startScan();
			m_FrameLWTSearchAnimation.startAnimation();
			m_textVWTPrompt.setVisibility(View.VISIBLE);
			m_textVWTPrompt.setText(R.string.wt_searching);
			m_linearLCreateAP.setVisibility(View.GONE);
			m_btnCreateWT.setBackgroundResource(R.drawable.x_wt_create);
		}
		if (isWifiConnect()) {//若是打開了wifi
			this.m_wiFiAdmin.startScan();
			this.m_wtSearchProcess.start();
			this.m_FrameLWTSearchAnimation.startAnimation();
			this.m_textVWTPrompt.setVisibility(0);
			this.m_textVWTPrompt.setText(R.string.wt_searching);
			this.m_linearLCreateAP.setVisibility(8);
			this.m_btnCreateWT.setBackgroundResource(R.drawable.x_wt_create);
			this.m_gifRadar.setVisibility(8);
			m_listWifi.clear();
			if (m_wiFiAdmin.mWifiManager.getScanResults() != null) {
				int result = m_wiFiAdmin.mWifiManager.getScanResults().size();
				int i = 0;
				for (i = 0; i < result; ++i) {
					if (m_wiFiAdmin.mWifiManager.getScanResults().get(i).SSID
							.startsWith(WIFI_AP_HEADER))
						m_listWifi.add(m_wiFiAdmin.mWifiManager
								.getScanResults().get(i));
				}
				Log.i("way", "wifi size:"
						+ m_wiFiAdmin.mWifiManager.getScanResults().size());
			}
			m_wTAdapter.setData(m_listWifi);
			m_wTAdapter.notifyDataSetChanged();

		}

		if (getWifiApState()) {//若是建立了熱點
			if (m_wiFiAdmin.getApSSID().startsWith(WIFI_AP_HEADER)) {
				m_textVWTPrompt.setVisibility(View.GONE);
				m_linearLCreateAP.setVisibility(View.VISIBLE);
				m_progBarCreatingAP.setVisibility(View.GONE);
				m_btnCreateWT.setVisibility(View.VISIBLE);
				m_gifRadar.setVisibility(View.VISIBLE);
				m_btnCreateWT.setBackgroundResource(R.drawable.x_ap_close);
				m_textVPromptAP.setText(getString(R.string.pre_wt_connect_ok)
						+ getString(R.string.middle_wt_connect_ok)
						+ m_wiFiAdmin.getApSSID()
						+ getString(R.string.suf_wt_connect_ok));
			}
		}
	}

	@Override
	public void handleConnectChange() {//監聽廣播,若是鏈接上一個熱點,執行更新界面
		// TODO Auto-generated method stub
		Message msg = handler.obtainMessage(m_nWTConnectResult);
		handler.sendMessage(msg);
	}

	@Override
	public void scanResultsAvailable() {//監聽廣播,搜索到各個wifi
		// TODO Auto-generated method stub
		Message msg = handler.obtainMessage(m_nWTScanResult);
		handler.sendMessage(msg);
	}

	@Override
	public void wifiStatusNotification() {//監聽打開或關閉wifi廣播
		// TODO Auto-generated method stub
		m_wiFiAdmin.mWifiManager.getWifiState();
	}

	//建立熱點進程與超時處理
	class CreateAPProcess implements Runnable {
		public boolean running = false;
		private long startTime = 0L;
		private Thread thread = null;

		CreateAPProcess() {
		}

		public void run() {
			while (true) {
				if (!this.running)
					return;
				if ((m_wiFiAdmin.getWifiApState() == 3)
						|| (m_wiFiAdmin.getWifiApState() == 13)
						|| (System.currentTimeMillis() - this.startTime >= 30000L)) {
					Message msg = handler.obtainMessage(m_nCreateAPResult);
					handler.sendMessage(msg);
				}
				try {
					Thread.sleep(5L);
				} catch (Exception localException) {
				}
			}
		}

		public void start() {
			try {
				thread = new Thread(this);
				running = true;
				startTime = System.currentTimeMillis();
				thread.start();
			} finally {
			}
		}

		public void stop() {
			try {
				this.running = false;
				this.thread = null;
				this.startTime = 0L;
			} finally {
			}
		}
	}
	
	//搜索超時處理線程
	class WTSearchProcess implements Runnable {
		public boolean running = false;
		private long startTime = 0L;
		private Thread thread = null;

		WTSearchProcess() {
		}

		public void run() {
			while (true) {
				if (!this.running)
					return;
				if (System.currentTimeMillis() - this.startTime >= 30000L) {
					// Message localMessage = Message.obtain(handler);
					// localMessage.what = 0;
					// localMessage.sendToTarget();
					Message msg = handler.obtainMessage(m_nWTSearchTimeOut);
					handler.sendMessage(msg);
				}
				try {
					Thread.sleep(10L);
				} catch (Exception localException) {
				}
			}
		}

		public void start() {
			try {
				this.thread = new Thread(this);
				this.running = true;
				this.startTime = System.currentTimeMillis();
				this.thread.start();
			} finally {
			}
		}

		public void stop() {
			try {
				this.running = false;
				this.thread = null;
				this.startTime = 0L;
			} finally {
			}
		}
	}
}


3.最後是最重要的wifi管理類:WifiAdmin,這裏有一些經常使用的函數,好比說建立一個wifi的WifiConfiguration,建立熱點,以及獲取各類wifi狀態等函數

/**
 * wifi管理類
 * 
 * @author way
 * 
 */
public class WifiAdmin {
	private static WifiAdmin wiFiAdmin = null;
	private List<WifiConfiguration> mWifiConfiguration;
	private WifiInfo mWifiInfo;
	private List<ScanResult> mWifiList;
	WifiManager.WifiLock mWifiLock;
	public WifiManager mWifiManager;

	public WifiAdmin(Context paramContext) {
		this.mWifiManager = ((WifiManager) paramContext
				.getSystemService("wifi"));
		this.mWifiInfo = this.mWifiManager.getConnectionInfo();
	}

	public static WifiAdmin getInstance(Context paramContext) {
		if (wiFiAdmin == null)
			wiFiAdmin = new WifiAdmin(paramContext);
		return wiFiAdmin;
	}

	private WifiConfiguration isExsits(String paramString) {
		Iterator localIterator = this.mWifiManager.getConfiguredNetworks()
				.iterator();
		WifiConfiguration localWifiConfiguration;
		do {
			if (!localIterator.hasNext())
				return null;
			localWifiConfiguration = (WifiConfiguration) localIterator.next();
		} while (!localWifiConfiguration.SSID.equals("\"" + paramString + "\""));
		return localWifiConfiguration;
	}

	public void AcquireWifiLock() {
		this.mWifiLock.acquire();
	}

	public void CreatWifiLock() {
		this.mWifiLock = this.mWifiManager.createWifiLock("Test");
	}

	public void OpenWifi() {
		if (!this.mWifiManager.isWifiEnabled())
			this.mWifiManager.setWifiEnabled(true);
	}

	public void ReleaseWifiLock() {
		if (this.mWifiLock.isHeld())
			this.mWifiLock.acquire();
	}

	public void addNetwork(WifiConfiguration paramWifiConfiguration) {
		int i = this.mWifiManager.addNetwork(paramWifiConfiguration);
		this.mWifiManager.enableNetwork(i, true);
	}

	public void closeWifi() {
		this.mWifiManager.setWifiEnabled(false);
	}
	
	public void connectConfiguration(int paramInt) {
		if (paramInt > this.mWifiConfiguration.size())
			return;
		this.mWifiManager
				.enableNetwork(((WifiConfiguration) this.mWifiConfiguration
						.get(paramInt)).networkId, true);
	}
	/**
	 * 根據wifi信息建立一個熱點
	 * @param paramWifiConfiguration
	 * @param paramBoolean
	 */
	public void createWiFiAP(WifiConfiguration paramWifiConfiguration,
			boolean paramBoolean) {
		try {
			Class localClass = this.mWifiManager.getClass();
			Class[] arrayOfClass = new Class[2];
			arrayOfClass[0] = WifiConfiguration.class;
			arrayOfClass[1] = Boolean.TYPE;
			Method localMethod = localClass.getMethod("setWifiApEnabled",
					arrayOfClass);
			WifiManager localWifiManager = this.mWifiManager;
			Object[] arrayOfObject = new Object[2];
			arrayOfObject[0] = paramWifiConfiguration;
			arrayOfObject[1] = Boolean.valueOf(paramBoolean);
			localMethod.invoke(localWifiManager, arrayOfObject);
			return;
		} catch (Exception localException) {
		}
	}
	
	/**
	 * 建立一個wifi信息
	 * @param ssid 名稱
	 * @param paramString2 密碼
	 * @param paramInt 有3個參數,1是無密碼,2是簡單密碼,3是wap加密
	 * @param paramString3 是"ap"仍是"wt"
	 * @return
	 */
	public WifiConfiguration createWifiInfo(String ssid, String paramString2,
			int paramInt, String paramString3) {
		WifiConfiguration localWifiConfiguration1 = new WifiConfiguration();
		localWifiConfiguration1.allowedAuthAlgorithms.clear();
		localWifiConfiguration1.allowedGroupCiphers.clear();
		localWifiConfiguration1.allowedKeyManagement.clear();
		localWifiConfiguration1.allowedPairwiseCiphers.clear();
		localWifiConfiguration1.allowedProtocols.clear();
		if (paramString3.equals("wt")) {
			localWifiConfiguration1.SSID = ("\"" + ssid + "\"");
			WifiConfiguration localWifiConfiguration2 = isExsits(ssid);
			if (localWifiConfiguration2 != null)
				mWifiManager.removeNetwork(localWifiConfiguration2.networkId);
			if (paramInt == 1) {
				localWifiConfiguration1.wepKeys[0] = "";
				localWifiConfiguration1.allowedKeyManagement.set(0);
				localWifiConfiguration1.wepTxKeyIndex = 0;
			} else if (paramInt == 2) {
				localWifiConfiguration1.hiddenSSID = true;
				localWifiConfiguration1.wepKeys[0] = ("\"" + paramString2 + "\"");
			} else {
				localWifiConfiguration1.preSharedKey = ("\"" + paramString2 + "\"");
				localWifiConfiguration1.hiddenSSID = true;
				localWifiConfiguration1.allowedAuthAlgorithms.set(0);
				localWifiConfiguration1.allowedGroupCiphers.set(2);
				localWifiConfiguration1.allowedKeyManagement.set(1);
				localWifiConfiguration1.allowedPairwiseCiphers.set(1);
				localWifiConfiguration1.allowedGroupCiphers.set(3);
				localWifiConfiguration1.allowedPairwiseCiphers.set(2);
			}
		} else {
			localWifiConfiguration1.SSID = ssid;
			localWifiConfiguration1.allowedAuthAlgorithms.set(1);
			localWifiConfiguration1.allowedGroupCiphers
					.set(WifiConfiguration.GroupCipher.CCMP);
			localWifiConfiguration1.allowedGroupCiphers
					.set(WifiConfiguration.GroupCipher.TKIP);
			localWifiConfiguration1.allowedGroupCiphers
					.set(WifiConfiguration.GroupCipher.WEP40);
			localWifiConfiguration1.allowedGroupCiphers
					.set(WifiConfiguration.GroupCipher.WEP104);
			localWifiConfiguration1.allowedKeyManagement.set(0);
			localWifiConfiguration1.wepTxKeyIndex = 0;
			if (paramInt == 1) {
				localWifiConfiguration1.wepKeys[0] = "";
				localWifiConfiguration1.allowedKeyManagement.set(0);
				localWifiConfiguration1.wepTxKeyIndex = 0;
			} else if (paramInt == 2) {
				localWifiConfiguration1.hiddenSSID = true;
				localWifiConfiguration1.wepKeys[0] = paramString2;
			} else if (paramInt == 3) {
				localWifiConfiguration1.preSharedKey = paramString2;
				localWifiConfiguration1.allowedAuthAlgorithms.set(0);
				localWifiConfiguration1.allowedProtocols.set(1);
				localWifiConfiguration1.allowedProtocols.set(0);
				localWifiConfiguration1.allowedKeyManagement.set(1);
				localWifiConfiguration1.allowedPairwiseCiphers.set(2);
				localWifiConfiguration1.allowedPairwiseCiphers.set(1);
			}
		}
		return localWifiConfiguration1;
	}	
	
	/**
	 * 端口指定id的wifi
	 * @param paramInt
	 */
	public void disconnectWifi(int paramInt) {
		this.mWifiManager.disableNetwork(paramInt);
	}
	/**
	 * 獲取熱點名
	 * @return
	 */
	public String getApSSID() {
		try {
			Method localMethod = this.mWifiManager.getClass()
					.getDeclaredMethod("getWifiApConfiguration", new Class[0]);
			if (localMethod == null)
				return null;
			Object localObject1 = localMethod.invoke(this.mWifiManager,
					new Object[0]);
			if (localObject1 == null)
				return null;
			WifiConfiguration localWifiConfiguration = (WifiConfiguration) localObject1;
			if (localWifiConfiguration.SSID != null)
				return localWifiConfiguration.SSID;
			Field localField1 = WifiConfiguration.class
					.getDeclaredField("mWifiApProfile");
			if (localField1 == null)
				return null;
			localField1.setAccessible(true);
			Object localObject2 = localField1.get(localWifiConfiguration);
			localField1.setAccessible(false);
			if (localObject2 == null)
				return null;
			Field localField2 = localObject2.getClass()
					.getDeclaredField("SSID");
			localField2.setAccessible(true);
			Object localObject3 = localField2.get(localObject2);
			if (localObject3 == null)
				return null;
			localField2.setAccessible(false);
			String str = (String) localObject3;
			return str;
		} catch (Exception localException) {
		}
		return null;
	}
	/**
	 * 獲取wifi名
	 * @return
	 */
	public String getBSSID() {
		if (this.mWifiInfo == null)
			return "NULL";
		return this.mWifiInfo.getBSSID();
	}

	public List<WifiConfiguration> getConfiguration() {
		return this.mWifiConfiguration;
	}
	/**
	 * 獲取ip地址
	 * @return
	 */
	public int getIPAddress() {
		if (this.mWifiInfo == null)
			return 0;
		return this.mWifiInfo.getIpAddress();
	}
	/**
	 * 獲取物理地址
	 * @return
	 */
	public String getMacAddress() {
		if (this.mWifiInfo == null)
			return "NULL";
		return this.mWifiInfo.getMacAddress();
	}	
	
	/**
	 * 獲取網絡id
	 * @return
	 */
	public int getNetworkId() {
		if (this.mWifiInfo == null)
			return 0;
		return this.mWifiInfo.getNetworkId();
	}
	/**
	 * 獲取熱點建立狀態
	 * @return
	 */
	public int getWifiApState() {
		try {
			int i = ((Integer) this.mWifiManager.getClass()
					.getMethod("getWifiApState", new Class[0])
					.invoke(this.mWifiManager, new Object[0])).intValue();
			return i;
		} catch (Exception localException) {
		}
		return 4;
	}
	/**
	 * 獲取wifi鏈接信息
	 * @return
	 */
	public WifiInfo getWifiInfo() {
		return this.mWifiManager.getConnectionInfo();
	}

	public List<ScanResult> getWifiList() {
		return this.mWifiList;
	}

	public StringBuilder lookUpScan() {
		StringBuilder localStringBuilder = new StringBuilder();
		for (int i = 0;; i++) {
			if (i >= 2)
				return localStringBuilder;
			localStringBuilder.append("Index_" + new Integer(i + 1).toString()
					+ ":");
			localStringBuilder.append(((ScanResult) this.mWifiList.get(i))
					.toString());
			localStringBuilder.append("/n");
		}
	}
	
	/**
	 * 設置wifi搜索結果
	 */
	public void setWifiList() {
		this.mWifiList = this.mWifiManager.getScanResults();
	}
	/**
	 * 開始搜索wifi
	 */
	public void startScan() {
		this.mWifiManager.startScan();
	}
}

還有一些自定義View我就不貼出來了,你們下載源碼本身看吧。
相關文章
相關標籤/搜索