導航:首頁 > 操作系統 > android監聽wifi連接

android監聽wifi連接

發布時間:2023-03-17 16:57:12

android manager wifi 怎麼用

獲取Wifi的控制類WifiManager。
WifiManager wm=(WifiManager)getSystemService(Context.WIFI_SERVICE);
接下來可以對wifi操作了,比如要打開、關閉wifi,可以通過WifiManager的setWifiEnabled()方法來開關wifi。
若要查看一些信息,可以通過getConnectionInfo()方法得到WifiInfo類的對象,WifiInfo類里主要提供手機wifi上面存儲的連接信息。
WifiInfo類方法:
1、getBSSID() 獲取接入點的mac地址(String)
2、getIpAddress() 獲取本機的IP地址 (int)
3、getLinkSpeed() 獲取連接速度(不是下載速度),單位為Mbps (int)
4、getMacAddress() 獲取mac地址 (String)
5、getNetworkId() 獲取網路id號。每一個設定好了的網路都有一個獨一無二的整數型ID號,用來識別網路,當操作請求時(翻譯)。簡而言之,就是這個號就是代表一個連接點,手機可以通過wifi連接很多無線網的。
6、getRssi() 返回收到的信號強度,是個負數。(好像到-113就表示一點信號都沒有,也就是說數越大信號就越好)
7、getSSID() 獲取無線信號提供者的名稱 (就是要連的網路的名字)(String)
上面那個類只能查到本機的mac地址與ip,要只查看本機的詳細信息,可以通過這個類:DhcpInfo df=wm.getDhcpInfo();
DhcpInfo類沒什麼方法,提供了一些欄位:
1、dns1 第一個DNS
2、dns2 如上
3、gateway 網關
4、ipAddress IP地址
5、netmask 子網掩碼
6、serverAddress 服務端地址(其實就是路由器ip,和網關一樣)
7、leaseDuration 和上面的getLinkSpeed() 方法的值接近,可能是連接速度,不過單位不是Mbps,getLinkSpeed() 得到72,這個欄位的值是7200

上面的IP與網關、子網掩碼等都是int型數值,直接看看不懂,附上一個我寫的方法把int轉成String類型。

private String intToString(int a){
StringBuffer sb=new StringBuffer();
int b=(a>>0)&0xff;
sb.append(b+".");
b=(a>>8)&0xff;
sb.append(b+".");
b=(a>>16)&0xff;
sb.append(b+".");
b=(a>>24)&0xff;
sb.append(b);
return sb.toString();
}

WifiConfiguration 類主要提供一個wifi配置的所有信息
有如下欄位(自己明白的不一定正確):
BSSID 接入點的mac地址。
SSID 接入點的名字。
networkId 網路號
preSharedKey WPA-PSK密碼,如果有就會得到一個*(這玩意就是判斷是不是有密碼的)
priority 優先順序
status 連接狀態,值是WifiConfiguration.Status中欄位的一種。

WifiConfiguration.Status 提供了3個欄位表示wifi連接的三種狀態
1.CURRENT 值為0,表示處於連接狀態
2.DISABLED 值為1,表示網路不可用
3. ENABLED 值為2,表示網路可用但沒連接

ScanResult wifi掃描到的接入點信息
1.BSSID
2.SSID
3.capabilities
4.frequency
5.level

關於接收WIFI狀態改變接收廣播信息:

ACTION: WifiManager.WIFI_STATE_CHANGED_ACTION ( "android.net.wifi.WIFI_STATE_CHANGED")wifi狀態變化觸發,觸發兩次。

可接收兩個信息:(鍵) (這個是監聽wifi狀態變化的,wifi狀態變化並不包括wifi的連接狀態,只是單純的指示wifi的5種狀態)

1. WifiManager.EXTRA_PREVIOUS_WIFI_STATE("previous_wifi_state") int型值 intent.getIntExtra("鍵",0);(第二個為得不到時的默認值)

2. WifiManager.EXTRA_WIFI_STATE("wifi_state") int型值 intent.getIntExtra("鍵",0);(第二個為得不到時的默認值)

ACTION: WifiManager.NETWORK_STATE_CHANGED_ACTION("android.net.wifi.STATE_CHANGE")wifi連接網路的狀態廣播,連接過程中接收多次,在連接過程中可與獲取NetworkInfo對象,通過ni.getState()可以獲取wifi連接狀態。如果連接state處於connected狀態,可以通過WifiManager.EXTRA_WIFI_INFO得到wifiInfo對象。(不重要細節:測試時發現 下面isconnected()方法為true時,這個廣播還處於connecting狀態,再一次廣播才變成connected)

可接收兩個信息:(鍵)

1. WifiManager.EXTRA_BSSID("bssid") String類型值 intent.getStringExtra("鍵")

2. WifiManager.EXTRA_NETWORK_INFO("networkInfo") T getParcelableExtra(「鍵」)

ACTION: WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION( "android.net.wifi.supplicant.CONNECTION_CHANGE") 判斷是否WIFI打開了,變化觸發一次

可接收一個信息:(鍵)(這個應該是廣播wifi啟動狀態的,true表示連接到wifi設備,一般在wifi state處於enable時得到,false則表示斷開設備連接,wifi此時狀態為disabling。這只是指機器內的wifi連接狀態變化,與網路無關)

1. WifiManager.EXTRA_SUPPLICANT_CONNECTED("connected") boolean類型返回值 intent.getBooleanExtra(「鍵」, true)第二個是默認值

ACTION: WifiManager.SUPPLICANT_STATE_CHANGED_ACTION("android.net.wifi.supplicant.STATE_CHANGE")發送WIFI連接的過程信息,如果出錯ERROR信息才會收到。連接WIFI時觸發,觸發多次。

可接收兩個信息:(鍵)

1. WifiManager.EXTRA_NEW_STATE("newState") intent.getParcelableExtra("鍵")

2. WifiManager.EXTRA_SUPPLICANT_ERROR("supplicantError") int型值 getIntExtra(「鍵」, int)

WIFI狀態int值對應的狀態:

WifiManager.WIFI_STATE_DISABLED ==1

WifiManager.WIFI_STATE_DISABLING ==0

WifiManager. WIFI_STATE_ENABLED==3

WifiManager. WIFI_STATE_ENABLING==2

WifiManager. WIFI_STATE_UNKNOWN==4

上面的是在有wifi的環境下測的,沒在沒WIFI的環境下測,不一定準,但差不多了。測試機型HTC G17。

如果在連接WIFI的過程中(Connecting),去連接網路地址(比如http://www..com)會得到找不到地址的異常,並且在8秒左右之內(就測了一台定製機),不能連接這一地址,否則報找不到地址異常。

這個包並不判斷網路連接狀態,只是判斷wifi的各種狀態,如果需要判斷網路狀態, 在android.net包中。ConnectivityManager 。

//判斷WIFI是否連接
private boolean isConnected(Context context){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
System.out.println(ni.getState());
System.out.println(ni.getDetailedState()+"-----");
if(ni != null && ni.getState()==State.CONNECTED)
return true;
return false;
}

private boolean isWifiConected(Context context) {
WifiManager wm = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
List<WifiConfiguration> list = wm.getConfiguredNetworks();
Iterator<WifiConfiguration> it = list.iterator();
while (it.hasNext()) {
WifiConfiguration wc = it.next();
if (wc.status == WifiConfiguration.Status.CURRENT)
return true;
}
return false;
}//2012.11.12在4.0機器上發現這個方法一直返回false,估計我理解錯了,不要用。

WifiInfo不為空並不代表這個類裡面就存了信息,getMacAdress可能為空。

public String getMac() {
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wi = wm.getConnectionInfo();
if(wi == null)
return null;
return wi.getMacAddress();
}

② Android:通過WifiManager監聽Wifi信號強弱

先來了解下Android如何獲取wifi的信息:

WifiManager wifi_service = (WifiManager)getSystemService(WIFI_SERVICE);

WifiInfo wifiInfo = wifi_service.getConnectionInfo();

其中WifiManager是管理wifi的最重要的類,詳細請參考

http://developer.android.com/reference/android/net/wifi/WifiManager.html

其中wifiInfo有以下的方法:

wifiinfo.getBSSID();

wifiinfo.getSSID();

wifiinfo.getIpAddress();獲取IP地址。

wifiinfo.getMacAddress();獲取MAC地址。

wifiinfo.getNetworkId();獲取網路ID。

wifiinfo.getLinkSpeed();獲取連接速度,可以讓用戶獲知這一信息。

wifiinfo.getRssi();獲取RSSI,RSSI就是接受信號強度指示。在這可以直 接和華為提供的Wi-Fi信號閾值進行比較來提供給用戶,讓用戶對網路或地理位置做出調整來獲得最好的連接效果。

這里得到信號強度就靠wifiinfo.getRssi();這個方法。得到的值是一個0到-100的區間值,是一個int型數據,其中0到-50表示信號最好,-50到-70表示信號偏差,小於-70表示最差,有可能連接不上或者掉線,一般Wifi已斷則值為-200。

界面很簡單,只有一個ImageView用來顯示圖片,activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >

    <ImageView

        android:id="@+id/wifi_image"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_marginLeft="145dp"

        android:layout_gravity="center" />

</LinearLayout>

用於獲得信號強度並改變圖片的Activity:MainActivity

package com.my.phonesingle;

import java.util.Timer;

import java.util.TimerTask;

import android.annotation.SuppressLint;

import android.app.Activity;

import android.net.wifi.WifiInfo;

import android.net.wifi.WifiManager;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.widget.ImageView;

import android.widget.Toast;

public class MainActivity extends Activity {

private WifiInfo wifiInfo = null; //獲得的Wifi信息

private WifiManager wifiManager = null; //Wifi管理器

private Handler handler;

private ImageView wifi_image; //信號圖片顯示

private int level; //信號強度值

@SuppressLint("HandlerLeak")

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//圖片控制項初始化

wifi_image = (ImageView) findViewById(R.id.wifi_image);

// 獲得WifiManager

wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);

// 使用定時器,每隔5秒獲得一次信號強度值

Timer timer = new Timer();

timer.scheleAtFixedRate(new TimerTask() {

@Override

public void run() {

wifiInfo = wifiManager.getConnectionInfo();

//獲得信號強度值

level = wifiInfo.getRssi();

//根據獲得的信號強度發送信息

if (level <= 0 && level >= -50) {

Message msg = new Message();

msg.what = 1;

handler.sendMessage(msg);

} else if (level < -50 && level >= -70) {

Message msg = new Message();

msg.what = 2;

handler.sendMessage(msg);

} else if (level < -70 && level >= -80) {

Message msg = new Message();

msg.what = 3;

handler.sendMessage(msg);

} else if (level < -80 && level >= -100) {

Message msg = new Message();

msg.what = 4;

handler.sendMessage(msg);

} else {

Message msg = new Message();

msg.what = 5;

handler.sendMessage(msg);

}

}

}, 1000, 5000);

// 使用Handler實現UI線程與Timer線程之間的信息傳遞,每5秒告訴UI線程獲得wifiInto

handler = new Handler() {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

// 如果收到正確的消息就獲取WifiInfo,改變圖片並顯示信號強度

case 1:

wifi_image.setImageResource(R.drawable.single4);

Toast.makeText(MainActivity.this,

"信號強度:" + level + " 信號最好", Toast.LENGTH_SHORT)

.show();

break;

case 2:

wifi_image.setImageResource(R.drawable.single3);

Toast.makeText(MainActivity.this,

"信號強度:" + level + " 信號較好", Toast.LENGTH_SHORT)

.show();

break;

case 3:

wifi_image.setImageResource(R.drawable.single2);

Toast.makeText(MainActivity.this,

"信號強度:" + level + " 信號一般", Toast.LENGTH_SHORT)

.show();

break;

case 4:

wifi_image.setImageResource(R.drawable.single1);

Toast.makeText(MainActivity.this,

"信號強度:" + level + " 信號較差", Toast.LENGTH_SHORT)

.show();

break;

case 5:

wifi_image.setImageResource(R.drawable.single0);

Toast.makeText(MainActivity.this,

"信號強度:" + level + " 無信號", Toast.LENGTH_SHORT)

.show();

break;

default:

//以防萬一

wifi_image.setImageResource(R.drawable.single0);

Toast.makeText(MainActivity.this, "無信號",

Toast.LENGTH_SHORT).show();

}

}

};

}

}

然後只需要打開Wifi測試一下,就行啦!

③ android 代碼怎麼實時監控連接當前wifi熱點的設備的連接或斷開事件

請參考以下代碼實現監控:
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobNetInfo = connectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiNetInfo = connectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
// BSToast.showLong(context, "網路不可以用");
// 改變背景或者 處理網路的全局變數
} else {
// 改變背景或者 處理網路的全局變數
}
把上的代碼放到一個廣播裡面。。

④ android wifi正在連接的狀態廣播

很多時候我們都需要實時監聽網路狀態,當網路狀態發生變化之後立即通知程序進行不同的操作。
監聽廣播的兩種方式:
(1)在AndroidManifest.xml配置文件中聲明
<receiver android:name=".NetworkConnectChangedReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
<action android:name="android.net.wifi.STATE_CHANGE" />
</intent-filter>
</receiver>1234567

(2)在代碼中注冊
IntentFilter filter = new IntentFilter(); filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(new NetworkConnectChangedReceiver(), filter);12345

接下來創建實時監聽網路連接與斷開狀態變化的BroadcastReceiver對象,我們需要繼承android.content.BroadcastReceiver,並實現其onReceive方法,下面我們就創建一個名為NetworkConnectChangedReceiver廣播接收者,看一下具體的實現代碼,由於代碼寫得很詳細,就不一一解釋了
package com.per.networkconnectdome;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.net.wifi.WifiManager;import android.os.Parcelable;import android.util.Log;public class NetworkConnectChangedReceiver extends BroadcastReceiver {
private String getConnectionType(int type) {
String connType = ""; if (type == ConnectivityManager.TYPE_MOBILE) {
connType = "3G網路數據";
} else if (type == ConnectivityManager.TYPE_WIFI) {
connType = "WIFI網路";
} return connType;
} @Override
public void onReceive(Context context, Intent intent) { if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {// 監聽wifi的打開與關閉,與wifi的連接無關
int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
Log.e("TAG", "wifiState:" + wifiState); switch (wifiState) { case WifiManager.WIFI_STATE_DISABLED: break; case WifiManager.WIFI_STATE_DISABLING: break;
}
} // 監聽wifi的連接狀態即是否連上了一個有效無線路由
if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
Parcelable parcelableExtra = intent
.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if (null != parcelableExtra) { // 獲取聯網狀態的NetWorkInfo對象
NetworkInfo networkInfo = (NetworkInfo) parcelableExtra; //獲取的State對象則代表著連接成功與否等狀態
NetworkInfo.State state = networkInfo.getState(); //判斷網路是否已經連接
boolean isConnected = state == NetworkInfo.State.CONNECTED;
Log.e("TAG", "isConnected:" + isConnected); if (isConnected) {
} else {

}
}
} // 監聽網路連接,包括wifi和移動數據的打開和關閉,以及連接上可用的連接都會接到監聽
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { //獲取聯網狀態的NetworkInfo對象
NetworkInfo info = intent
.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); if (info != null) { //如果當前的網路連接成功並且網路連接可用
if (NetworkInfo.State.CONNECTED == info.getState() && info.isAvailable()) { if (info.getType() == ConnectivityManager.TYPE_WIFI
|| info.getType() == ConnectivityManager.TYPE_MOBILE) {
Log.i("TAG", getConnectionType(info.getType()) + "連上");
}
} else {
Log.i("TAG", getConnectionType(info.getType()) + "斷開");
}
}
}
}
}

在onReceive方法裡面,我們可以獲取從廣播而來的Intent中的數據,這包含很多有用的信息,其中
ConnectivityManager : 主要管理和網路連接相關的操作
WifiManager: 管理和wifi相關的信息
TelephonyManager: 管理和手機、運營商等的相關信息
NetworkInfo類包含了對wifi和mobile兩種網路模式連接的詳細描述,通過getState()方法獲取的State對象,代表著連接成功與否的狀態。
最後記得添加許可權:
<uses-permission android:name="android.permission.access_wifi_state" /><uses-permission android:name="android.permission.access_network_state" />

⑤ Android監聽網路狀態框架

就這么簡單,讓我們開始吧。

看下最終實現的使用:

日誌:

好了,新建一個AndroidLibray開始實現。

許可權走一波:

首先,咱們需要一個監聽網路狀態的工具類

在lib中創建一個廣播,然後再配置文件里注冊一下。

完善下咱們的receiver:

監聽介面:

manager:

再加上一個枚舉類:

OK,一套正常操作,一個最普通網路監聽類寫完了。接著咱們嘗試用註解,讓這個小框架看的有檔次些。

完善一下自定義註解:

然後來捋一下思路:

照樣是固定三部曲,按照步驟來:

1.先完善我們的注冊方法

在這里,我創建了一個方法封裝類。比較簡單: MethodManager

這里的 mMethodList 是方法封裝類(MethodManager)的List,用來存儲篩選後的MainActivity中方法,也就是網路監聽方法。以下是方法的篩選:

咱們定義一個post方法,去完成這項工作:

這里實現了通過網路監聽註解上方的參數,我們可以單獨監聽某一種網路狀態的變化。比如

上方參數表明,只有在WIFI斷開和連接的時候,方法才會做出響應。想要所有提示設置為AUTO就行啦。

OK,做完邏輯以後執行一下:

大功告成!跑一下看看效果!

項目地址: https://github.com/CocoYuki/NetListener

是一個練手的小項目,實際網路請求在7.0時就能通過一個CallBack輕松搞定了。

閱讀全文

與android監聽wifi連接相關的資料

熱點內容
抖音直播雲伺服器 瀏覽:624
一加7pro文件夾data 瀏覽:424
程序員淋雨 瀏覽:947
python輸出數字序列中的空格 瀏覽:78
怎麼將pdf文件大小 瀏覽:734
氧原子相對分子量演算法 瀏覽:988
加密機為什麼是安全的 瀏覽:451
單片機拼音輸入法 瀏覽:789
蘋果筆記本t2加密晶元怎麼打開 瀏覽:796
安卓如何把手機投屏至電視 瀏覽:739
方舟編譯器現在可提速哪些軟體 瀏覽:60
微信加密為什麼是黑屏 瀏覽:473
android去電狀態 瀏覽:604
蘋果13如何加密視頻 瀏覽:815
linuxweblogic緩存 瀏覽:69
雲伺服器不同地域 瀏覽:946
python鬧鍾怎麼打 瀏覽:686
虛擬主機伺服器有什麼區別 瀏覽:833
演算法與程序的奧秘章節檢測 瀏覽:378
找pdf 瀏覽:531