Android 通過WIFI狀態監聽廣播,判斷進入指定wifi范圍

原文地址:http://blog.csdn.net/kongxiuqi/article/details/52524500

---------------------------------------------

WIFI狀態變化會發送廣播,一些可用的廣播在WifiManger.java中可以看到。
廣播一:WIFI 狀態開關變化的監聽,enabled,disabled等
/**
 * Broadcast intent action indicating that Wi-Fi has been enabled, disabled,
 * enabling, disabling, or unknown. One extra provides this state as an int.
 * Another extra provides the previous state, if available.
 *
 * @see #EXTRA_WIFI_STATE
 * @see #EXTRA_PREVIOUS_WIFI_STATE
 */
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String WIFI_STATE_CHANGED_ACTION ="android.net.wifi.WIFI_STATE_CHANGED";
// 自定義個broadcast 在廣播接收器Broadcast中判斷,
?if?(WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction()))?{//這個監聽wifi的打開與關閉,與wifi的連接無關??
????????????int?wifiState?=?intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,?0);???
????????????LogTag.showTAG_e("WIFI狀態",?"wifiState"+wifiState);??
????????????switch?(wifiState)?{???
????????????case?WifiManager.WIFI_STATE_DISABLED:???
????????????????break;???
????????????case?WifiManager.WIFI_STATE_DISABLING:???
????????????????break;???
???????????//??
????????????}???
????????}
各個狀態的值如下:
/**
 * Wi-Fi is currently being disabled. The state will change to {@link #WIFI_STATE_DISABLED} if
 * it finishes successfully.
 *
 * @see #WIFI_STATE_CHANGED_ACTION
 * @see #getWifiState()
 */
public static final int WIFI_STATE_DISABLING = 0;
/**
 * Wi-Fi is disabled.
 *
 * @see #WIFI_STATE_CHANGED_ACTION
 * @see #getWifiState()
 */
public static final int WIFI_STATE_DISABLED = 1;
/**
 * Wi-Fi is currently being enabled. The state will change to {@link #WIFI_STATE_ENABLED} if
 * it finishes successfully.
 *
 * @see #WIFI_STATE_CHANGED_ACTION
 * @see #getWifiState()
 */
public static final int WIFI_STATE_ENABLING = 2;
/**
 * Wi-Fi is enabled.
 *
 * @see #WIFI_STATE_CHANGED_ACTION
 * @see #getWifiState()
 */
public static final int WIFI_STATE_ENABLED = 3;
/**
 * Wi-Fi is in an unknown state. This state will occur when an error happens while enabling
 * or disabling.
 *
 * @see #WIFI_STATE_CHANGED_ACTION
 * @see #getWifiState()
 */
public static final int WIFI_STATE_UNKNOWN = 4;
廣播二 wifi連接狀態變化的監聽
/**
 * Broadcast intent action indicating that the state of Wi-Fi connectivity
 * has changed. One extra provides the new state
 * in the form of a {@link android.net.NetworkInfo} object. If the new
 * state is CONNECTED, additional extras may provide the BSSID and WifiInfo of
 * the access point.
 * as a {@code String}.
 * @see #EXTRA_NETWORK_INFO
 * @see #EXTRA_BSSID
 * @see #EXTRA_WIFI_INFO
 */
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String NETWORK_STATE_CHANGED_ACTION = "android.net.wifi.STATE_CHANGE";

?//?這個監聽wifi的連接狀態即是否連上了一個有效無線路由,當上邊廣播的狀態是WifiManager.WIFI_STATE_DISABLING,和WIFI_STATE_DISABLED的時候,根本不會接到這個廣播。??
????//?在上邊廣播接到廣播是WifiManager.WIFI_STATE_ENABLED狀態的同時也會接到這個廣播,當然剛打開wifi肯定還沒有連接到有效的無線??
????if?(WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction()))?{??
????????????Parcelable?parcelableExtra?=?intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);????
????????????if?(null?!=?parcelableExtra)?{????
????????????????NetworkInfo?networkInfo?=?(NetworkInfo)?parcelableExtra;????
????????????????State?state?=?networkInfo.getState();??
????????????????boolean?isConnected?=?state==State.CONNECTED;//當然,這邊可以更精確的確定狀態??
????????????????LogTag.showTAG_e(this.getClass().getSimpleName(),?"isConnected"+isConnected);??
????????????????if(isConnected){??
????????????????}else{??
??????????????????????
????????????????}??
????????????}????
????????} ?

廣播三 wifi掃描列表完成
/**
 * An access point scan has completed, and results are available from the supplicant.
 * Call {@link #getScanResults()} to obtain the results. {@link #EXTRA_RESULTS_UPDATED}
 * indicates if the scan was completed successfully.
 */
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS";
wifi掃描完成,獲取wili列表 可以通過wifimanager的startScan主動發起掃描,掃描完成后會發送這個廣播
if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())) {Log.e(TAG, "WifiManager.SCAN_RESULTS_AVAILABLE_ACTION");WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);List<ScanResult> list = wifiManager.getScanResults();for (int i = 0; i < list.size(); i++) {Log.e(TAG, list.get(i).toString());Log.e(TAG, "ScanResult SSID = " + list.get(i).SSID);}
}
getScanResults 只能得到可用的列表,獲取所有wifi列表需用如下方法,該方法可以獲取已連接過的但是
不在范圍內的wifi信息
/**
 * Return a list of all the networks configured in the supplicant.
 * Not all fields of WifiConfiguration are returned. Only the following
 * fields are filled in:
 * <ul>
 * <li>networkId</li>
 * <li>SSID</li>
 * <li>BSSID</li>
 * <li>priority</li>
 * <li>allowedProtocols</li>
 * <li>allowedKeyManagement</li>
 * <li>allowedAuthAlgorithms</li>
 * <li>allowedPairwiseCiphers</li>
 * <li>allowedGroupCiphers</li>
 * </ul>
 * @return a list of network configurations in the form of a list
 * of {@link WifiConfiguration} objects. Upon failure to fetch or
 * when when Wi-Fi is turned off, it can be null.
 */
public List<WifiConfiguration> getConfiguredNetworks() {try {return mService.getConfiguredNetworks();} catch (RemoteException e) {Log.w(TAG, "Caught RemoteException trying to get configured networks: " + e);return null;}
}
廣播四
/**
 * Broadcast intent action indicating that a connection to the supplicant has
 * been established (and it is now possible
 * to perform Wi-Fi operations) or the connection to the supplicant has been
 * lost. One extra provides the connection state as a boolean, where {@code true}
 * means CONNECTED.
 * @see #EXTRA_SUPPLICANT_CONNECTED
 */
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String SUPPLICANT_CONNECTION_CHANGE_ACTION ="android.net.wifi.supplicant.CONNECTION_CHANGE";
另外還有一個監聽網絡狀態變化的廣播
ConnectivityManager.CONNECTIVITY_ACTION
/**
 * A change in network connectivity has occurred. A default connection has either
 * been established or lost. The NetworkInfo for the affected network is
 * sent as an extra; it should be consulted to see what kind of
 * connectivity event occurred.
 * <p/>
 * If this is a connection that was the result of failing over from a
 * disconnected network, then the FAILOVER_CONNECTION boolean extra is
 * set to true.
 * <p/>
 * For a loss of connectivity, if the connectivity manager is attempting
 * to connect (or has already connected) to another network, the
 * NetworkInfo for the new network is also passed as an extra. This lets
 * any receivers of the broadcast know that they should not necessarily
 * tell the user that no data traffic will be possible. Instead, the
 * receiver should expect another broadcast soon, indicating either that
 * the failover attempt succeeded (and so there is still overall data
 * connectivity), or that the failover attempt failed, meaning that all
 * connectivity has been lost.
 * <p/>
 * For a disconnect event, the boolean extra EXTRA_NO_CONNECTIVITY
 * is set to {@code true} if there are no connected networks at all.
 */
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";

如果我們需要判斷手機進入到某個wifi地區就可以通過該廣播,以及掃描wifi列表進行實現
代碼如下

public class NetworkConnectChangedReceiver extends BroadcastReceiver {private static final String TAG = NetworkConnectChangedReceiver.class.getSimpleName();@Override
    public void onReceive(Context context, Intent intent) {// 處理掃描完成廣播,根據掃描結果比對是否進入了某個特定wifi范圍if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())) {Log.e(TAG, "WifiManager.SCAN_RESULTS_AVAILABLE_ACTION");WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);List<ScanResult> list = wifiManager.getScanResults();
            // 此處循環遍歷,可以根據SSID 或者MAC,與某個指定wifi進行對比,如果相等可以認為進入了該wifi的范圍。
            for (int i = 0; i < list.size(); i++) {Log.e(TAG, list.get(i).toString());Log.e(TAG, "ScanResult SSID = " + list.get(i).SSID);}}// 這個監聽網絡連接的設置,包括wifi和移動數據的打開和關閉。.
        // 最好用的還是這個監聽。wifi如果打開,關閉,以及連接上可用的連接都會接到監聽。見log
        // 這個廣播的最大弊端是比上邊兩個廣播的反應要慢,如果只是要監聽wifi,我覺得還是用上邊兩個配合比較合適
        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo gprs = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);NetworkInfo wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);Log.i(TAG, "網絡狀態改變:" + wifi.isConnected() + " 3g:" + gprs.isConnected());Log.e(TAG, "ConnectivityManager.CONNECTIVITY_ACTION");NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);if (info != null) {Log.e(TAG, "info.getTypeName()" + info.getTypeName());Log.e(TAG, "getSubtypeName()" + info.getSubtypeName());Log.e(TAG, "getState()" + info.getState());Log.e(TAG, "getDetailedState()"
                        + info.getDetailedState().name());Log.e(TAG, "getDetailedState()" + info.getExtraInfo());Log.e(TAG, "getType()" + info.getType());if (NetworkInfo.State.CONNECTED == info.getState()) {} else if (info.getType() == 1) {if (NetworkInfo.State.DISCONNECTING == info.getState()) {Log.e(TAG, "disconnect");}}}
            // 開啟wifi掃描,掃描完成后發送廣播
            WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);wifiManager.startScan();
        }}
}
需要注冊
    mIntentFilter = new IntentFilter();?mIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);?mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);?mIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);?mIntentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
    mIntentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
??registerReceiver(mReceiver, mIntentFilter);
或者在AndroidManifest中添加
    
<receiver android:name=".receiver.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" /><action android:name="android.net.wifi.SCAN_RESULTS" /></intent-filter>
</receiver>
另外需要配置權限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />


-------------

更多的Java,Angular,Android,大數據,J2EE,Python,數據庫,Linux,Java架構師,:

http://www.cnblogs.com/zengmiaogen/p/7083694.html



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538921.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538921.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538921.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2018年度最佳網頁設計與開發教程

任何一個網站從開發到最終上線&#xff0c; 都是需要團隊協作且謹慎的一個過程&#xff0c;而實際中往往會遇到各類問題&#xff0c;所以網頁設計師通常需要扮演多種角色&#xff0c;除了掌握必備的網頁設計技能外&#xff0c;更應該對后期的開發流程及內容有所了解&#xff0c…

mysql_ping()函數的作用以及返回值的類型正確的是,[單選] mysql_ping()函數的作用以及返回值的類型正確的是:()...

[單選] mysql_ping()函數的作用以及返回值的類型正確的是&#xff1a;()更多相關問題中華田園犬&#xff0c;雄性&#xff0c;2歲&#xff0c;昨晚外出未歸&#xff0c;今晨發現患犬精神沉郁&#xff0c;呼吸急促&#xff0c;體溫39℃&#xff0c;左胸側壁中下部有創1884年新疆…

java 截取byte數組_2020年的秋招已經開始了!最新Java面試題大全(文末附參考答案)送給大家...

包含的模塊本文分為十九個模塊&#xff0c;分別是&#xff1a;Java 基礎、容器、多線程、反射、對象拷貝、Java Web 、異常、網絡、設計模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM共包含 208 道面…

MVP模式在Android項目中的使用

煩了在Activity中編寫太多的代碼&#xff0c;該app由我來主導。就選擇用MVP模式。 概述 MVP是模型&#xff08;Model&#xff09;、視圖&#xff08;View&#xff09;、主持人&#xff08;Presenter&#xff09;的縮寫&#xff0c;分別代表項目中3個不同的模塊。 模型&#…

運行時錯誤7內存溢出_C++程序運行時的內存模型

C程序在運行時會將內存劃分為4個區域&#xff1a;1代碼區&#xff1a;存放函數體的二進制代碼&#xff0c;由操作系統進行管理2全局區&#xff1a;存放程序的全局變量、靜態變量、常量3棧區&#xff1a;由編譯器進行自動分配和釋放&#xff0c;存放函數的參數值&#xff0c;局部…

php strip_tags 少,詳解PHP函數 strip_tags的用法不足之處

這篇文章主要介紹了詳解PHP函數 strip_tags 處理字符串缺陷bug的相關資料,需要的朋友可以參考下詳解PHP函數 strip_tags 處理字符串缺陷bugPHP 函數 strip_tags() 是一個常用函數&#xff0c;該函數可以剝去字符串中的 HTML、XML 以及 PHP 的標簽。極大方便了對字符串的操作&am…

玩轉Android之MVVM開發模式實戰,炫酷的DataBinding!

原文&#xff1a;http://blog.csdn.net/u012702547/article/details/52077515 --------------------------------------------------------- MVP可以結合android的DataBinding -------------------------以下轉載--------------- C# 很早就有了MVVM的開發模式&#xff0c;An…

打造一款便攜版的Sublime Text

https://segmentfault.com/a/1190000000707661 https://www.cnblogs.com/52cik/p/sublime-diy.html 直接安裝Sublime Text&#xff0c;不要打開 大家可以參照上文提到的《Sublime Text 全程指引》中的步驟去進行安裝。我這里使用的是Sublime Text 2&#xff0c;其實3也是一樣的…

confluence創建頁面加載緩慢_樹莓派4B使用docker安裝confluence

說明confluence是一個專業的企業知識管理與協同軟件&#xff0c;可以用于構建企業wiki。通過它可以實現團隊成員之間的協作和知識共享。現在大多數公司都會部署一套confluence&#xff0c;用作內部wiki。另外confluence也可以作為個人的知識管理工具來用&#xff0c;只需要花10…

python用map提取一個數的個十百位數_如何使用python中的map函數?

我們在使用python過程中&#xff0c;為了避免錯誤刪除&#xff0c;會選擇做好一個序列后可以插入另外的序列中做為新序列的一部分內容。方便完成一些復雜的工程或多個片段分別編輯后再串成一個完整工程的操作。之前小編向大家介紹了在序列中起到累計作用的reduce函數(https://w…

matlab粒子加速器仿真,粒子群算法優化PID參數 仿真不出結果 程序如下

用的是《MATLAB智能算法30個案例分析》中的程序1.文件名為PSO_PID.mfunction z PSO_PID(x)assignin(base,Kp,x(1)); % 粒子群依次賦值給Kp 這部分運行結果> PSO_PIDassignin(base,Ki,x(2)); …

CentOS5、6的啟動流程

CentOS5/6的啟動流程啟動流程畫了張圖,看著更清晰些: (centos7的啟動流程變化挺大的,這部分待補充)補充(/etc/rc.d/rc.local 不屬于任何服務,為特殊文件,可將不能定義為服務又想開機運行的命令定義在此文件中)添加自定義服務:[rootel5 init.d]# vi /etc/init.d/testsrv #!/bin…

Spark交互式分析平臺Apache Zeppelin的安裝

Zeppelin介紹 Apache Zeppelin提供了web版的類似ipython的notebook&#xff0c;用于做數據分析和可視化。背后可以接入不同的數據處理引擎&#xff0c;包括Spark, Hive, tajo等&#xff0c;原生支持Scala, Java, shell, markdown等。它的整體展現和使用形式和Databricks Cloud是…

win7 php zend,win7系統打開WZend Studio PHP出錯的解決方法

很多朋友安裝win7系統后&#xff0c;在使用的過程中會遇到win7系統打開WZend Studio PHP出錯的情況&#xff0c;可能有很多用戶還是不能自己處理win7系統打開WZend Studio PHP出錯的問題&#xff0c;其實簡單的來說處理win7系統打開WZend Studio PHP出錯的問題只需要按照 1、在…

9個元素換6次達到排序序列_C語言必學的12個排序算法:希爾排序(第3篇)

基本思想希爾排序&#xff08;Shells Sort&#xff09;&#xff0c;以發明人命名&#xff0c;又稱為縮小增量排序&#xff0c;也是一種插入排序算法。主要思想&#xff1a;直接插入排序算法時間和待排數據有關&#xff0c;其平均復雜度是O(n^2)&#xff0c;但是在待排數據已經有…

java快捷鍵禁用_pycharm 掌握這些快捷鍵,你就是大神!!

最重要的快捷鍵1. ctrlshiftA:萬能命令行 2. shift兩次:查看資源文件新建工程第一步操作1. module設置把空包分層去掉,compact empty middle package 2. 設置當前的工程是utf-8,設置的Editor-->File Encodings-->全部改成utf-8,注釋1. ctrl/:單行注釋光標操作1. ctrlalte…

如何在 5 分鐘內讀懂區塊鏈的架構思維?

作為入門者&#xff0c;如何在最短的時間了解區塊鏈技術&#xff0c;區塊鏈思維&#xff0c;以及比特幣的金融原理呢&#xff1f;本文嘗試從比特幣的架構設計思維出發&#xff0c;讓人從宏觀上搞清楚區塊鏈的技術本質。 本文授權轉載自阿里技術 作者 | 鄭吉 區塊鏈不是一種技術…

魅族Flyme5.x以上系統INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

用android studio 連接魅族flyme5.0安裝app&#xff0c;報 Installation error: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 解決方法&#xff1a; 1、進入手機管家 2、權限管理 3、usb安裝管理 4、關閉 完美解決問題

php取key的value值,獲取數組中key和value的值

方法1&#xff1a;PHP 4 引入了 foreach 結構&#xff0c;和 Perl 以及其他語言很像。這只是一種遍歷數組簡便方法。foreach 僅能用于數組&#xff0c;當試圖將其用于其它數據類型或者一個未初始化的變量時會產生錯誤。有兩種語法&#xff0c;第二種比較次要但卻是第一種的有用…

arduino 上傳項目出錯_Arduino多核編程:簡單例子

不管你是Arduino領域的新手還是經驗豐富的開發人員&#xff0c;很可能你還只使用過單核在進行編程。 這沒有什么好笑的---- 事實上&#xff0c;直到幾天前我才使用Arduino IDE進行了第一次多核編程。 我和所有其他Arduino粉絲都非常喜歡IDE的易用性以及MicroController 開發所需…