當前位置:首頁 » 網路管理 » androidwifi廣播
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

androidwifi廣播

發布時間: 2023-02-05 00:16:21

A. 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" />

B. 【Android初級】android掃描WiFi列表的正確用法

最近有個需求,需要做一個掃描WiFi列表的功能,也在網上找了一些資料,但有些資料是有問題的,然後自己摸索了下,總結如下。

本地環境:

AS版本 3.0.1,DEMO APK 的 Min SDK Version 是 API 23,Target SDK Version 是 API 24,Compile SDK Version是 API 26,真機是Android 7.0

1、打開WiFi,並打開定位服務(在設置內找到定位服務-訪問我的位置信息-開啟)

2、在 onCreate 裡面動態申請許可權

String[] PERMS_INITIAL={Manifest.permission.ACCESS_FINE_LOCATION};

requestPermissions(PERMS_INITIAL,127);

3、在 onCreate 裡面注冊廣播

IntentFilter filter =new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);

registerReceiver(mReceiver, filter);

4、定義 mReceiver

private BroadcastReceivermReceiver =new BroadcastReceiver() {

@Override

    public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {

List results =wifiManager.getScanResults();

if (results !=null) {

Log.d(TAG,"results size: " + results.size());

}

}

}

};

5、在layout裡面定義一個Button,點擊後開始掃描

WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);

boolean scanResult =wifiManager.startScan(); // 最好檢查下返回值,因為這個方法可能會調用失敗

Log.d(TAG,"scanResult: " + scanResult);

6、在 AndroidManifest.xml 裡面聲明許可權

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

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

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

有人可能會有疑問,為什麼在 onCreate裡面動態申請了許可權 ACCESS_FINE_LOCATION,又在 Manifest 裡面重復聲明了一次

經過本地驗證,去掉其中任意一個,都拿不到WiFi掃描結果,也就是 onReceive 方法不會被執行(有不同結論的請留言共同探討)

7、錯誤用法

boolean scanResult =wifiManager.startScan();

List list =wifiManager.getScanResults();

調用 startScan 之後立馬調用 getScanResults,這個時候拿到的WiFi列表是上一次的掃描結果,不是最新的,一定要在廣播接收器裡面獲取掃描結果。

C. android.net.wifi.supplicant.STATE_CHANGE廣播無法接收問題

在rockchip平台,5.1版本下
SUPPLICANT_STATE_CHANGED_ACTION需要通過靜態注冊才可以接收到!
類似SCREEN_ON OFF這種,注意這條思路。

???action從常量名改成字元串就可以了???是的。

D. android wifi連接成功後會發送什麼廣播

1、拿您的手機,點設置。 2、進入設置頁面,選擇WLAN. 3、進入WLAN頁面,選擇更多選項。在菜單中選擇添加網路。 4、進入添加網路頁面,網路ssid就是網路名,當然你要知道你的網路名是什麼啦。 5、安全性一般選wpa/apa2psk。 6、接下來就輸入密碼啦,完成後點保存,這樣就可以了,手機是不是可以接上網路了呢

E. android如何收聽wifi關閉的廣播

接收手機網路改變的 廣播 然後判斷是什麼網

F. Android的WiFi功能總結

先進行WiFi許可權的聲明

<!-- 獲取WiFi狀態 -->

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

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

<!--  api <= Android29調用setWifiEnabled  -->

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

<!-- 定位許可權(api >= 23 用於 WIFI掃描)-->

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

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

注意:ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION是危險級許可權需要使用中還需要動態申請,申請其中一個即可。

WifiManager mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);

if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.R) {

Intent panelIntent =new Intent(Settings.Panel.ACTION_WIFI);

startActivityForResult(panelIntent,null);

}else{ mWifiManager.setWifiEnabled(!isEnable);}

可以通過監聽系統廣播來了解WiFi狀態。

WIFI_STATE_CHANGED_ACTION:WiFi開關狀態;

SCAN_RESULTS_AVAILABLE_ACTION:WiFi列表變化;

RSSI_CHANGED_ACTION:WiFi信號強度變化。

IntentFilter mFilter =new IntentFilter();

mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);

mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);

mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);

mReceiver =new BroadcastReceiver() {

@Override

public void onReceive(Context context,Intent intent) {

    handleEvent(intent);

}

};

registerReceiver(mReceiver, mFilter);

private void handleEvent(Intent intent) {

String action = intent.getAction();

if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {

final int wifiState =mWifiManager.getWifiState();

if(wifiState ==WifiManager.WIFI_STATE_ENABLED){

    postDelayed(()->{mRefreshLayout.autoRefresh();},1000);

}

}else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) {

}else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {

if(System.currentTimeMillis() -mLastUpateWifiRssiTime <1000){//刷新太快

            return;

}

}

updateWifiChange();

}

切記:wifistate切換到WifiManager.WIFI_STATE_ENABLED,mWifiManager.isWifiEnabled()需要有個等待時間切換。

3的基礎上解析廣播應答

private void updateWifiChange() {

final int wifiState =mWifiManager.getWifiState();

switch (wifiState) {

case WifiManager.WIFI_STATE_ENABLED:

ArrayListresults = (ArrayList)mWifiManager.getScanResults();

updateApListView(results);

mWlanSb.setChecked(mWifiManager.isWifiEnabled() );

break;

case WifiManager.WIFI_STATE_ENABLING:

break;

case WifiManager.WIFI_STATE_DISABLING:

mAdapter.clearData();

mWlanSb.setChecked(mWifiManager.isWifiEnabled() );

break;

case WifiManager.WIFI_STATE_DISABLED:

break;

}

}