1. 程式人生 > >Android之Wifi學習(1)

Android之Wifi學習(1)

在Android中對Wifi操作,android本身提供了一些有用的包,在android.net.wifi包下面。簡單介紹一下:

大致可以分為四個主要的類ScanResult,wifiConfiguration,WifiInfo,WifiManager

(1)ScanResult,主要是通過wifi 硬體的掃描來獲取一些周邊的wifi 熱點的資訊。

(2)wifiConfiguration 在我們連通一個wifi 接入點的時候,需要獲取到的一些資訊。大家可以跟我們有線的裝置進行對比一下。

(3)WifiInfo 在我們的wifi 已經連通了以後,可以通過這個類獲得一些已經連通的wifi 連線的資訊獲取當前連結的資訊,這裡資訊就比較簡單了,這裡簡單介紹一下這裡的方法:

       getBSSID() 獲取BSSID

       getDetailedStateOf() 獲取客戶端的連通性

       getHiddenSSID() 獲得SSID 是否被隱藏

       getIpAddress() 獲取IP 地址

       getLinkSpeed() 獲得連線的速度

       getMacAddress() 獲得Mac 地址

       getRssi() 獲得802.11n 網路的訊號

       getSSID() 獲得SSID

       getSupplicanState() 返回具體客戶端狀態的資訊

(4)wifiManager 這個不用說,就是用來管理我們的wifi 連線,這裡已經定義好了一些類,可以供我們使用。這裡來說相對複雜,裡面的內容比較多,但是通過字面意思,我們還是可以獲得很多相關的資訊。這個類裡面預先定義了許多常量,我們可以直接使用,不用再次建立。

介紹完了,開始寫一個Demo吧。程式已啟動效果圖如下:

看程式碼,其中有註釋,我就不多說了。

佈局檔案程式碼:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  
    android:id="@+id/mScrollView" android:layout_width="fill_parent"  
    android:layout_height="wrap_content" android:scrollbars="vertical">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:id="@+id/allNetWork"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:text="當前沒有掃描到Wifi網路"
    />
<Button
    android:id="@+id/scan"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="掃描網路"
    />
<Button
    android:id="@+id/start"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="開啟Wifi"
    />
<Button
    android:id="@+id/stop"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="關閉Wifi"
    />
<Button
    android:id="@+id/check"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Wifi狀態"
    />
</LinearLayout>
</ScrollView>

上面佈局檔案中的ScrollView用來在Activity中顯示右側滾動條,如果資料多的話,則可以往下滑動繼續顯示未顯示完的資料。

主頁面程式碼:

package org.sunchao;

import java.util.List;

import android.app.Activity;
import android.net.wifi.ScanResult;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

public class Main extends Activity implements OnClickListener {
	// 右側滾動條按鈕
	private ScrollView sView; 
	private TextView allNetWork;
	private Button scan;
	private Button start;
	private Button stop;
	private Button check;
	private WifiAdmin mWifiAdmin;
	// 掃描結果列表
	private List<ScanResult> list;
	private ScanResult mScanResult;
	private StringBuffer mStringBuffer = new StringBuffer();

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		mWifiAdmin = new WifiAdmin(Main.this);
		init();
	}

	// 按鈕的初始化
	public void init() {
		sView = (ScrollView) findViewById(R.id.mScrollView);
		allNetWork = (TextView) findViewById(R.id.allNetWork);
		scan = (Button) findViewById(R.id.scan);
		start = (Button) findViewById(R.id.start);
		stop = (Button) findViewById(R.id.stop);
		check = (Button) findViewById(R.id.check);
		scan.setOnClickListener(Main.this);
		start.setOnClickListener(Main.this);
		stop.setOnClickListener(Main.this);
		check.setOnClickListener(Main.this);
	}

	// WIFI_STATE_DISABLING 0
	// WIFI_STATE_DISABLED 1
	// WIFI_STATE_ENABLING 2
	// WIFI_STATE_ENABLED 3
	public void start() {
		mWifiAdmin.openWifi();
		Toast.makeText(Main.this, "當前Wifi網絡卡狀態為" + mWifiAdmin.checkState(),
				Toast.LENGTH_SHORT).show();
	}

	public void stop() {
		mWifiAdmin.closeWifi();
		Toast.makeText(Main.this, "當前Wifi網絡卡狀態為" + mWifiAdmin.checkState(),
				Toast.LENGTH_SHORT).show();
	}

	public void check() {
		Toast.makeText(Main.this, "當前Wifi網絡卡狀態為" + mWifiAdmin.checkState(),
				Toast.LENGTH_SHORT).show();
	}

	public void getAllNetWorkList() {
		// 每次點選掃描之前清空上一次的掃描結果
		if (mStringBuffer != null) {
			mStringBuffer = new StringBuffer();
		}

		// 開始掃描網路
		mWifiAdmin.startScan();
		list = mWifiAdmin.getWifiList();

		if (list != null) {
			for (int i = 0; i < list.size(); i++) {
				mScanResult = list.get(i);
				// 得到網路的SSID:the network name
				mStringBuffer = mStringBuffer
					.append(mScanResult.SSID).append("        ")
					.append(mScanResult.BSSID).append("        ")
					.append(mScanResult.capabilities).append("        ")
					.append(mScanResult.frequency).append("        ")
					.append(mScanResult.level).append("        ")
					.append("\n\n");
			}
			allNetWork.setText("掃描到的所有Wifi網路:\n" + mStringBuffer.toString());
		}
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.scan:
			getAllNetWorkList();
			break;
		case R.id.start:
			start();
			break;
		case R.id.stop:
			stop();
			break;
		case R.id.check:
			check();
			break;
		default:
			break;
		}
	}
}

上面用到了一個WifiAdmin類,這是我自己寫的一個類,用於對Wifi的操作進行一次封裝,裡面的方法很多,我們本次Demo只用到了其中幾種,但我還是先全部放上去吧,以後會用到的。

WifiAdmin工具類程式碼:

package org.sunchao;

import java.util.List;

import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.WifiLock;

public class WifiAdmin {
	// 定義WifiManager物件
	private WifiManager mWifiManager;
	// 定義WifiInfo物件
	private WifiInfo mWifiInfo;
	// 掃描出的網路連線列表
	private List<ScanResult> mWifiList;
	// 網路連線列表
	private List<WifiConfiguration> mWifiConfiguration;
	// 定義一個WifiLock
	WifiLock mWifiLock;

	// 構造器
	public WifiAdmin(Context context) {
		// 取得WifiManager物件
		mWifiManager = (WifiManager) context
				.getSystemService(Context.WIFI_SERVICE);
		// 取得WifiInfo物件
		mWifiInfo = mWifiManager.getConnectionInfo();
	}

	// 開啟WIFI
	public void openWifi() {
		if (!mWifiManager.isWifiEnabled()) {
			mWifiManager.setWifiEnabled(true);
		}
	}

	// 關閉WIFI
	public void closeWifi() {
		if (mWifiManager.isWifiEnabled()) {
			mWifiManager.setWifiEnabled(false);
		}
	}

	// 檢查當前WIFI狀態
	public int checkState() {
		return mWifiManager.getWifiState();
	}

	// 鎖定WifiLock
	public void acquireWifiLock() {
		mWifiLock.acquire();
	}

	// 解鎖WifiLock
	public void releaseWifiLock() {
		// 判斷時候鎖定
		if (mWifiLock.isHeld()) {
			mWifiLock.acquire();
		}
	}

	// 建立一個WifiLock
	public void creatWifiLock() {
		mWifiLock = mWifiManager.createWifiLock("Test");
	}

	// 得到配置好的網路
	public List<WifiConfiguration> getConfiguration() {
		return mWifiConfiguration;
	}

	// 指定配置好的網路進行連線
	public void connectConfiguration(int index) {
		// 索引大於配置好的網路索引返回
		if (index > mWifiConfiguration.size()) {
			return;
		}
		// 連線配置好的指定ID的網路
		mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,
				true);
	}

	public void startScan() {
		mWifiManager.startScan();
		// 得到掃描結果
		mWifiList = mWifiManager.getScanResults();
		// 得到配置好的網路連線
		mWifiConfiguration = mWifiManager.getConfiguredNetworks();
	}

	// 得到網路列表
	public List<ScanResult> getWifiList() {
		return mWifiList;
	}

	// 檢視掃描結果
	public StringBuilder lookUpScan() {
		StringBuilder stringBuilder = new StringBuilder();
		for (int i = 0; i < mWifiList.size(); i++) {
			stringBuilder
					.append("Index_" + new Integer(i + 1).toString() + ":");
			// 將ScanResult資訊轉換成一個字串包
			// 其中把包括:BSSID、SSID、capabilities、frequency、level
			stringBuilder.append((mWifiList.get(i)).toString());
			stringBuilder.append("/n");
		}
		return stringBuilder;
	}

	// 得到MAC地址
	public String getMacAddress() {
		return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress();
	}

	// 得到接入點的BSSID
	public String getBSSID() {
		return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID();
	}

	// 得到IP地址
	public int getIPAddress() {
		return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();
	}

	// 得到連線的ID
	public int getNetworkId() {
		return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();
	}

	// 得到WifiInfo的所有資訊包
	public String getWifiInfo() {
		return (mWifiInfo == null) ? "NULL" : mWifiInfo.toString();
	}

	// 新增一個網路並連線
	public void addNetwork(WifiConfiguration wcg) {
		int wcgID = mWifiManager.addNetwork(wcg);
		mWifiManager.enableNetwork(wcgID, true);
	}

	// 斷開指定ID的網路
	public void disconnectWifi(int netId) {
		mWifiManager.disableNetwork(netId);
		mWifiManager.disconnect();
	}
}

最後,我們看一下AndroidManifest.xml配置檔案的程式碼,裡面有需要用到的許可權。這個比較重要,我剛開始就是忘記新增這些許可權,程式一啟動就掛。後來看LogCat才知道少了這些許可權的。
AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="org.sunchao" android:versionCode="1" android:versionName="1.0">
	<uses-sdk android:minSdkVersion="8" />

	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<activity android:name=".Main" android:label="@string/app_name">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>

	</application>
	<!-- 以下是使用wifi訪問網路所需的許可權 -->
	<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>
	<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
</manifest>

至此這個Demo就完成了,看效果圖。

相關推薦

AndroidWifi學習(1)

在Android中對Wifi操作,android本身提供了一些有用的包,在android.net.wifi包下面。簡單介紹一下:大致可以分為四個主要的類ScanResult,wifiConfiguration,WifiInfo,WifiManager(1)ScanResult

麥子學院學習視頻機器學習(1):1.1 機器學習介紹

社會學家 學生 策略 能夠 預測 輸入 min 外部程序 歸納 今天開始學習機器學習,在網上找了很多視頻還有書籍。由於本人不是計算機專業的學生,基礎知識還是比較薄弱,但我非常想學習機器學習以及深度學習。最後還是選擇了麥子學院的彭亮老師的《機器學習基礎介紹》(以

我的Android旅——學習、項目、心態

彌補 rdb HR 需求 學習資源 作品 思維 中國 網絡操作 學習Android也一年多了,項目做了五六個,有大有小,有難有易。一直以來都沒有好好總結過,今天周六休息,就寫下這一年多從事Android以來的一些感想和小經驗。涉及學習、項目和一些個人感受。 1.學習篇 我是

Androidwifi工作流程

Android Wifi的工作流程 一、WIFI工作相關部分 Wifi 網絡卡狀態 1.    WIFI_STATE_DISABLED:WIFI網絡卡不可用 2.    WIFI_STATE_DISAB

解讀AndroidService(1)基礎知識

本文翻譯自Android官方文件 一個Service是一個長期可以在後臺執行(當然不需要提供UI)的應用元件。其它元件可以啟動service,即使切換到另一個應用,該service仍然可以在後臺執行。另外,其它元件可以繫結一個service進行互動,甚至可以進行程序間通訊(interproces

Android格式變數%1$s、%1$d的用法

作用:動態的拼接字串,使程式碼更簡潔,更易維護和擴充套件。 1、整型 如,“他的手裡有XX個蘋果”,這個XX需要從服務或者別的地方獲取,那麼在程式碼中就可以這麼寫: <string name="number">他的手裡有%1$d個蘋果</string> 同時,

Java容器學習(1)-------------------JavaJava學習路(18)

前言——容器的學習,剛開始建議先掌握一些基本概念。個人經驗覺得,初學時,必須先從模仿開始,掌握基本方法,然後在平常的使用當中進一步深究,只會使用,內部原理一竅不懂也是不行的,debug的時候會無從下手,這篇文章純粹的屬於應用篇,入門使用篇,非常適合剛學習容器。 Hero類

androidwifi移植全過程

一、1.編譯核心,生成驅動模組      在核心的根目錄下執行make      生成libertas.ko 和libertas_sdio.ko      [*] Networking support  --->            [*]   Wireless  --->           

AndroidOpenCV學習

OpenCV learn 測試原始碼 環境:android studio 配置好NDK * download source from offical 下載的是3.3.0 * 執行sample需要先安裝OpenCVManager,這個讓人無語,不過

AndroidService學習篇一:Service啟動方式startService

Service概念及用途: A service is an application component that can perform long-running operations in the background and does not provide a u

androidwifi移植全過程(一)

硬體環境                                     WIFI模組:Marvell8686 SDIO WIFI                               開發板:S5PC100                        

spring springMVC 學習1

常見MVC框架比較 執行效能上: Jsp+servlet>struts1>spring mvc>struts2+freemarker>>struts2,ognl,值棧。 開發效率上,基本正好相反。值得強調的是,spring mvc開發效

和菜鳥一起學linuxwifi學習記錄

也差不多一個月沒有更新部落格了,元旦也過去了,8天的班也上完了,小病也好了,時間又回到了每個周的週末了,不知道幹嘛,突然發現好像失去了什麼,好像做了很多很多沒有意義的事,一直都是在原點打轉,不知道接下去會是什麼,不知道為了什麼。也許總會有一段日子覺得很迷茫,不知所措。這麼一

AndroidUI學習篇十:使用TabHost實現微部落格戶端介面

這裡模擬微部落格戶端進行案例開發,由於沒有圖片資源,所以就做了一個大體結構類似的案例,跟大家分享一下它的實現,這裡採用的是使用xml佈局結合TabActivity控制。 先看看實現的效果: 工程目錄結構: 以下是原始碼: MainActivity.java pac

Android學習——優化篇(1)

androi static 實用 mod 簡單 keys 階段 數據 秒級 一、優化的品質 1.簡練。2.可讀性強。3.模塊化;4.層次性;5.設計良好。6.高效。7.優雅;8.清晰。 二、常見的編程規範 1. 基本要求 · 結構清晰,簡

ESP8266 WIFI模組學習路(1)——模組的USB串列埠連線

ESP8266 WIFI模組是我一直想學習的模組,現在物聯網發展如此之快。 我們先看看ESP8266 WIFI模組長什麼樣子吧,如下圖: 然後,我們還需要一個TTL-USB串列埠線,如圖: 還需要一個串列埠除錯助手,為了接發資料。我使用的除錯助手如下圖:

1.AndroidTextView控制元件學習筆記

TextView控制元件學習 1        建立TextView物件有兩種方法: 1.1  在程式中建立TextView物件; TextView tv=new TextView(this);       tv.setText("您好");      setContent

Wifi原始碼學習(Android5.1wifi開關

wifi系列部落格地址: 正文: 老方法,從介面入手: 現在我們看到的這兩個介面就是android5.1 的wifi 設定介面了,我們就從這兒入手。 我們可以看到這個介面大概分為三個部分 1、開關 2、option items 3、列表

Android學習筆記(十)WIFI服務的開啟和關閉

效果演示 現在的程式大多都需要Internet支援,下面主要說下針對Wifi服務的開啟和關閉    詳細步驟 修改xml檔案 首先新建工程,然後修改main.xml <?xml version="1.0" encoding="utf-8"?> <

JavaWeb學習入門——圖書館管理系統開發(Hibernate學習1

pass ica void 技術分享 gets 學習 images 創建 driver 最近看了看JavaWeb的書籍,才感覺到大二時候學的JavaWeb才僅僅只是個入門。最尷尬的當初還沒咋學一直在看.NET,現在看起來JavaWeb,各種框架各種頭疼啊。看了幾個例子之後覺