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就完成了,看效果圖。
相關推薦
Android之Wifi學習(1)
在Android中對Wifi操作,android本身提供了一些有用的包,在android.net.wifi包下面。簡單介紹一下:大致可以分為四個主要的類ScanResult,wifiConfiguration,WifiInfo,WifiManager(1)ScanResult
麥子學院學習視頻之機器學習(1):1.1 機器學習介紹
社會學家 學生 策略 能夠 預測 輸入 min 外部程序 歸納 今天開始學習機器學習,在網上找了很多視頻還有書籍。由於本人不是計算機專業的學生,基礎知識還是比較薄弱,但我非常想學習機器學習以及深度學習。最後還是選擇了麥子學院的彭亮老師的《機器學習基礎介紹》(以
我的Android之旅——學習、項目、心態
彌補 rdb HR 需求 學習資源 作品 思維 中國 網絡操作 學習Android也一年多了,項目做了五六個,有大有小,有難有易。一直以來都沒有好好總結過,今天周六休息,就寫下這一年多從事Android以來的一些感想和小經驗。涉及學習、項目和一些個人感受。 1.學習篇 我是
Android之wifi工作流程
Android Wifi的工作流程 一、WIFI工作相關部分 Wifi 網絡卡狀態 1. WIFI_STATE_DISABLED:WIFI網絡卡不可用 2. WIFI_STATE_DISAB
解讀Android之Service(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類
android之wifi移植全過程
一、1.編譯核心,生成驅動模組 在核心的根目錄下執行make 生成libertas.ko 和libertas_sdio.ko [*] Networking support ---> [*] Wireless --->
Android之OpenCV學習
OpenCV learn 測試原始碼 環境:android studio 配置好NDK * download source from offical 下載的是3.3.0 * 執行sample需要先安裝OpenCVManager,這個讓人無語,不過
Android之Service學習篇一:Service啟動方式之startService
Service概念及用途: A service is an application component that can perform long-running operations in the background and does not provide a u
android之wifi移植全過程(一)
硬體環境 WIFI模組:Marvell8686 SDIO WIFI 開發板:S5PC100
spring 之 springMVC 學習1
常見MVC框架比較 執行效能上: Jsp+servlet>struts1>spring mvc>struts2+freemarker>>struts2,ognl,值棧。 開發效率上,基本正好相反。值得強調的是,spring mvc開發效
和菜鳥一起學linux之wifi學習記錄
也差不多一個月沒有更新部落格了,元旦也過去了,8天的班也上完了,小病也好了,時間又回到了每個周的週末了,不知道幹嘛,突然發現好像失去了什麼,好像做了很多很多沒有意義的事,一直都是在原點打轉,不知道接下去會是什麼,不知道為了什麼。也許總會有一段日子覺得很迷茫,不知所措。這麼一
Android之UI學習篇十:使用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.Android之TextView控制元件學習筆記
TextView控制元件學習 1 建立TextView物件有兩種方法: 1.1 在程式中建立TextView物件; TextView tv=new TextView(this); tv.setText("您好"); setContent
Wifi原始碼學習(Android5.1)之wifi開關
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,各種框架各種頭疼啊。看了幾個例子之後覺