導航:首頁 > 操作系統 > androidwifiscan

androidwifiscan

發布時間:2023-02-05 21:45:50

A. 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;

}

}

B. 淫技:android無屏操作之adb操控wifi

1.開啟wpa_supplicant服務端

meta_wpa_supplicant.conf是配置文件,ctrl_interface是wpa_supplicant與wpa_cli通信的介面,ssid為要連接的wifi熱點名稱,key_mgmt為加密方式(NONE表示不加密 O(∩_∩)O~)。

2.wpa_cli連接wpa_supplicant

3.掃描wifi

4.使能network0

上面都是完整的語句,我們可以直接使用/system/bin/wpa_cli -iwlan0 -p /data/misc/wifi/sockets進入wifi命令模式,如下圖所示,wifi命令模式下可以直接使用scan,status等指令

成功連上了TE-NonSignal的wifi,你可能會納悶,怎麼執行enable_network 0就連上了呢?手機怎麼知道network 0是什麼鬼呢?上面說了有個配置文件meta_wpa_supplicant.conf,有了這個配置文件就會自動連接TE-NonSignal網路了。

上面是使用配置文件去連接網路,當然我們也可以用命令行去連接網路啦
執行scan
然後執行scan_result,下圖為掃描結果

例如我們要連個公共網路OPPO-SZ,首先我們執行
add_network 如下圖返回4,說明接下來要連接的network的id為4

依次執行
set_network 4 ssid "OPPO-SZ"
set_network 4 key_mgmt NONE
enable_network 4
如下圖,說明成功連接上wifi了

C. Android WiFi掃描

Wifi scanning overview

必須許可權如下:

除必須許可權外,根據系統版本,還有不同的限制。具體如下

WifiManager.getScanResults() 方法的調用必須具備以下 任一 許可權:

否則會拋異常 SecurityException 。

WifiManager.startScan() 方法的調用必須滿足以下 所有 條件:

否則會拋異常 SecurityException 。

Android對 WifiManager.startScan() 的調用頻率進行了限制。對於超過此頻率的介面訪問, WifiManager 不會執行完整掃描,而是提供上次掃描所緩存的結果。

平均值:2211

wifi掃描有兩個必須許可權:

另外,隨著Android系統的升級,對WiFi掃描做了越來越嚴格的限制。系統對 WifiManager.getScanResults() 和 WifiManager.startScan() 所做的限制不太一樣,但若要實現一個完整的WiFi掃描,就需要「掃描+獲取」兩個步驟,因此綜合來看,WiFi掃描的行為變化如下:

需要同時滿足以下所有條件:

<font color='red'>注意:以上是官方文檔的說明,與實際測試的結果有出入,可能是手機廠商修改rom導致。</font>

(小米MIX2 8.0,三星N9600 8.1.0下,不開定位服務也能獲取到WiFi列表)

D. android開發怎麼判斷wifi信號強度

通過WifiManager的方法getScanResults()獲取List<ScanResult>的集合,ScanResult.level就是信號強度是個負數,然後使用
WifiManager.calculateSignalLevel(scanResult.level,
100);就可得到確定的信號強度(calculateSignalLevel為計算信號等級函數,MAX_RSSI和MIN_RSSI分別為最強和最弱信號強度等級的信號強度閥值)。

閱讀全文

與androidwifiscan相關的資料

熱點內容
單片機玻璃管加熱研究成果 瀏覽:756
財產pdf 瀏覽:791
java添加圖標 瀏覽:886
命令與征服4任務攻略 瀏覽:97
演算法和邏輯程序驗證 瀏覽:767
用戶管理系統php模板 瀏覽:419
中國銀行app賬號怎麼登錄 瀏覽:867
安卓手機icloud雲伺服器地址 瀏覽:801
加密門禁如何寫到小米手機 瀏覽:169
java靜態方法的多線程 瀏覽:265
CAXAXp下載打不開要加密 瀏覽:244
開鎖pdf 瀏覽:89
python可視化奶茶 瀏覽:226
命令方字幕 瀏覽:592
蘋果手機如何連接ipad伺服器 瀏覽:981
列印矩陣java 瀏覽:401
如何雙開一個不能雙開的app 瀏覽:536
抖音喜歡加密了怎麼打開 瀏覽:393
mysql命令行顯示表 瀏覽:365
國防離我們源碼200字 瀏覽:785