Android開發——WiFi信號檢測

来源:https://www.cnblogs.com/Lee-01/archive/2018/12/24/10171308.html
-Advertisement-
Play Games

1.首先在AndroidManifest.xml文件中添加如下代碼以開啟許可權: 2.Android有三個跟獲取WiFi信息相關的類:WifiManager,WifiInfo,ScanResult WifiManage 1 // 獲取系統wifi服務 2 WifiManage wm = (WifiMa ...


1.首先在AndroidManifest.xml文件中添加如下代碼以開啟許可權:

<!-- 獲取WiFi狀態的許可權 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 改變網路狀態的許可權 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<!-- 獲取網路許可權 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 往SDCard寫入數據許可權 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 在SDCard中創建與刪除文件許可權 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
2.Android有三個跟獲取WiFi信息相關的類:WifiManager,WifiInfo,ScanResult
  • WifiManage
 1 // 獲取系統wifi服務
 2 WifiManage wm = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
 3 // 獲取當前所連接wifi的信息
 4 WifiInfo wi = wm.getConnectionInfo();
 5 // 獲取掃描到的所有wifi信息
 6 List<ScanResult> scanResults = wm.getScanResults();
 7 // 獲取當前手機wifi網卡狀態
 8 int state = wm.getWifiState();    //state值為以下巨集定義
 9 WifiManager.WIFI_STATE_ENABLED    wifi網卡可用
10 WifiManager.WIFI_STATE_DISABLED    wifi網卡不可用
11 WifiManager.WIFI_STATE_DISABLING    wifi網卡正關閉
12 WifiManager.WIFI_STATE_ENABLING    wifi網卡正打開
13 WifiManager.WIFI_STATE_UNKNOWN    狀態未知
  • WifiInfo
1 WifiInfo wifiInfo = wifi_service.getConnectionInfo();    // 獲取當前所連接wifi的信息
2 wi.getSSID();        // 獲取當前連接wifi的名詞
3 wi.getBSSID();       // 獲取路由器Mac地址,String類型
4 wi.getMacAddress();  // 獲取本機Mac地址
5 wi.getRssi();        // 獲取當前連接wifi的信號強度,返回一個0~-100之間的int型數據
6 wi.getLinkSpeed();   // 獲取連接速度
7 WifiInfo.LINK_SPEED_UNITS; // 連接速度單位

註:RSSI,得到的值是一個0到-100的區間值,是一個int型數據,其中0到-50表示信號最好,-50到-70表示信號偏差,小於-70表示最差,有可能連接不上或者掉線,一般Wifi已斷則值為-200。

  • ScanResult
scanResult.SSID();
scanResult.BSSID();
scanResult.level;    // 信號強度(原始數據)
WifiManager.calculateSignalLevel(scanResult.level(),5); // 計算強度等級,此處分5級。

3.代碼

  • activity_main.xml資源文件
  1 <?xml version="1.0" encoding="utf-8"?>
  2 <android.support.constraint.ConstraintLayout
  3     xmlns:android="http://schemas.android.com/apk/res/android"
  4     xmlns:app="http://schemas.android.com/apk/res-auto"
  5     xmlns:tools="http://schemas.android.com/tools"
  6     android:layout_width="match_parent"
  7     android:layout_height="match_parent"
  8     tools:context="com.lee.rss_collector.MainActivity">
  9 
 10     <RelativeLayout
 11         android:id="@+id/relative_layout"
 12         android:layout_width="match_parent"
 13         android:layout_height="wrap_content"
 14         android:layout_margin="30dp"
 15         android:gravity="start|center_vertical">
 16 
 17         <Button
 18             android:id="@+id/start_button"
 19             android:layout_width="wrap_content"
 20             android:layout_height="wrap_content"
 21             android:layout_alignParentStart="true"
 22             android:layout_marginStart="20dp"
 23             android:text="@string/start_scan" />
 24 
 25         <Button
 26             android:id="@+id/stop_button"
 27             android:layout_width="wrap_content"
 28             android:layout_height="wrap_content"
 29             android:layout_marginStart="10dp"
 30             android:layout_toEndOf="@+id/start_button"
 31             android:text="@string/stop_scan" />
 32 
 33         <Button
 34             android:id="@+id/save_button"
 35             android:layout_width="wrap_content"
 36             android:layout_height="wrap_content"
 37             android:layout_marginStart="10dp"
 38             android:layout_toEndOf="@+id/stop_button"
 39             android:text="@string/save_button" />
 40 
 41         <LinearLayout
 42             android:id="@+id/curr_connected"
 43             android:layout_width="match_parent"
 44             android:layout_height="wrap_content"
 45             android:layout_below="@+id/start_button"
 46             android:layout_marginTop="10dp"
 47             android:orientation="vertical">
 48 
 49             <TextView
 50                 android:id="@+id/text_view_curr_connected"
 51                 android:layout_width="match_parent"
 52                 android:layout_height="wrap_content"
 53                 android:text="@string/curConnectWiFi" />
 54 
 55             <EditText
 56                 android:id="@+id/edit_text_curr_connected"
 57                 android:layout_width="match_parent"
 58                 android:layout_height="wrap_content"
 59                 android:cursorVisible="false"
 60                 android:focusable="false"
 61                 android:focusableInTouchMode="false" />
 62         </LinearLayout>
 63 
 64         <LinearLayout
 65             android:id="@+id/scan_result"
 66             android:layout_width="match_parent"
 67             android:layout_height="wrap_content"
 68             android:orientation="vertical"
 69             android:layout_below="@+id/curr_connected">
 70 
 71             <TextView
 72                 android:id="@+id/text_view_scan_result"
 73                 android:layout_width="match_parent"
 74                 android:layout_height="wrap_content"
 75                 android:layout_marginBottom="20dp"
 76                 android:text="@string/scanResult" />
 77             <ScrollView
 78                 android:layout_width="match_parent"
 79                 android:layout_height="wrap_content"
 80                 android:fadingEdge="vertical"
 81                 android:scrollbars="vertical">
 82 
 83                 <LinearLayout
 84                     android:id="@+id/list_wifi"
 85                     android:layout_width="match_parent"
 86                     android:layout_height="wrap_content"
 87                     android:orientation="vertical">
 88 
 89                     <EditText
 90                         android:id="@+id/edit_view_scan_result"
 91                         android:layout_width="match_parent"
 92                         android:layout_height="wrap_content"
 93                         android:cursorVisible="false"
 94                         android:focusable="false"
 95                         android:focusableInTouchMode="false" />
 96                 </LinearLayout>
 97             </ScrollView>
 98         </LinearLayout>
 99 
100     </RelativeLayout>
101 
102     <android.support.constraint.Guideline
103         android:id="@+id/guideline"
104         android:layout_width="wrap_content"
105         android:layout_height="wrap_content"
106         android:orientation="vertical"
107         app:layout_constraintGuide_begin="20dp" />
108 
109     <android.support.constraint.Guideline
110         android:id="@+id/guideline2"
111         android:layout_width="wrap_content"
112         android:layout_height="wrap_content"
113         android:orientation="horizontal"
114         app:layout_constraintGuide_begin="20dp" />
115 
116     <android.support.constraint.Group
117         android:id="@+id/group"
118         android:layout_width="wrap_content"
119         android:layout_height="wrap_content" />
120 </android.support.constraint.ConstraintLayout>
  • MainActivity.java主程式
  1 package com.lee.rss_collector;
  2 
  3 import android.content.Context;
  4 import android.net.wifi.ScanResult;
  5 import android.net.wifi.WifiInfo;
  6 import android.net.wifi.WifiManager;
  7 import android.os.Environment;
  8 import android.support.v7.app.AppCompatActivity;
  9 import android.os.Bundle;
 10 import android.view.View;
 11 import android.widget.EditText;
 12 import android.widget.Toast;
 13 
 14 import java.io.FileOutputStream;
 15 import java.util.List;
 16 
 17 public class MainActivity extends AppCompatActivity {
 18 
 19     // private Context mContext = getApplicationContext();  // 加這一句會閃退
 20     public boolean mFlag = true;    // 控制線程終止
 21     private String mCurrentConnect; // 保存當前所連WiFi信息
 22     private StringBuilder mListInfo;// 保存掃描的WiFi列表信息
 23     private ScanThread mScanThread; // WiFi掃描的線程
 24 
 25     @Override
 26     protected void onCreate(Bundle savedInstanceState) {
 27         super.onCreate(savedInstanceState);
 28         // 顯示主頁面
 29         setContentView(R.layout.activity_main);
 30 
 31         // 監聽三個按鈕
 32         findViewById(R.id.start_button).setOnClickListener(mOnClickListener);
 33         findViewById(R.id.stop_button).setOnClickListener(mOnClickListener);
 34         findViewById(R.id.save_button).setOnClickListener(mOnClickListener);
 35     }
 36 
 37     public View.OnClickListener mOnClickListener = new View.OnClickListener() {
 38         @Override
 39         public void onClick(View v) {
 40             switch (v.getId()){
 41                 case R.id.start_button:
 42                     mFlag = true;   // 標誌位置為true,允許線程運行
 43                     mScanThread = new ScanThread(); // 新建WiFi掃描線程
 44                     mScanThread.start();    // 啟動線程
 45                     break;
 46                 case R.id.stop_button:
 47                     mFlag = false;  // 標誌位置為false,終止線程
 48                     break;
 49                 case R.id.save_button:
 50                     String filename = "wifi_data.txt";
 51                     String fileContent = mListInfo.toString();
 52                     try{
 53                         savaFileToSD(filename,fileContent);
 54                         Toast.makeText(getApplicationContext(), "數據寫入成功", Toast.LENGTH_SHORT).show();
 55                     }catch (Exception e){
 56                         e.printStackTrace();
 57                         Toast.makeText(getApplicationContext(), "數據寫入失敗", Toast.LENGTH_SHORT).show();
 58                     }
 59                     break;
 60             }
 61         }
 62     };
 63 
 64     private class ScanThread extends Thread {
 65         @Override
 66         public void run() {
 67             while (mFlag) {
 68                 // 在UI線程中獲取WiFi信息,並更新UI
 69                 runOnUiThread(new Runnable() {
 70                     @Override
 71                     public void run() {
 72                         obtainListInfo();
 73                     }
 74                 });
 75                 // 採樣頻率500ms
 76                 try {
 77                     Thread.sleep(500);
 78                 } catch (InterruptedException e) {
 79                     e.printStackTrace();
 80                 }
 81             }
 82         }
 83     }
 84 
 85     private void obtainListInfo(){
 86 
 87         WifiManager wm = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
 88         WifiInfo wi = wm.getConnectionInfo();
 89         String ssid = wi.getSSID();
 90         String bssid = wi.getBSSID();
 91         int rssi = wi.getRssi();
 92         int speed = wi.getLinkSpeed();
 93 
 94         // 記錄當前所連WiFi信息
 95         mCurrentConnect = "SSID: " + ssid +
 96                                 "\nMAC Address: " + bssid +
 97                                 "\nSignal Strength(dBm): " + rssi +
 98                                 "\nspeed: " + speed + " " + WifiInfo.LINK_SPEED_UNITS;
 99         // 記錄掃描的WiFi列表信息
100         if (wm.getWifiState() == WifiManager.WIFI_STATE_ENABLED) {
101             mListInfo = new StringBuilder();
102             List<ScanResult> scanResults = wm.getScanResults();
103             for (ScanResult sr:scanResults){
104                 mListInfo.append("SSID: ");
105                 mListInfo.append(sr.SSID);
106                 mListInfo.append("\nMAC Address: ");
107                 mListInfo.append(sr.BSSID);
108                 mListInfo.append("\nSignal Strength(dBm): ");
109                 mListInfo.append(sr.level);
110                 mListInfo.append("\n\n");
111             }
112 
113             // 更新UI上顯示的WiFi信息
114             EditText editTextCurr = findViewById(R.id.edit_text_curr_connected);
115             EditText editTextList = findViewById(R.id.edit_view_scan_result);
116             editTextCurr.setText(mCurrentConnect);
117             editTextList.setText(mListInfo.toString());
118         }
119     }
120     //往SD卡寫入文件的方法
121     public void savaFileToSD(String filename,String fileContent) throws Exception {
122         // 先判斷是否有SD卡以及是否有讀取SD卡的許可權
123         if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
124             // 設置文件路徑
125             String filePath = Environment.getExternalStorageDirectory().getCanonicalPath() + "/" + filename;
126             // new一個文件輸出流對象
127             FileOutputStream output = new FileOutputStream(filePath);
128             //將String字元串以位元組流的形式寫入到輸出流中
129             output.write(fileContent.getBytes());
130             output.close();     //關閉輸出流
131         } else {
132             Toast.makeText(MainActivity.this, "SD卡不存在或者不可讀寫", Toast.LENGTH_SHORT).show();
133         }
134     }
135 }


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MySQL 是世界上最流行的開源資料庫系統,而MariaDB(MySQL的一個分支)是世界上發展最快的開源資料庫系統。安裝MySQL伺服器之後,它的預設配置是不安全的,保護它是一般資料庫管理中的基本任務之一。 這將有助於加強和提升整體Linux伺服器安全性,因為攻擊者總是掃描系統任何部分的漏洞,而數... ...
  • k折交叉驗證 第一步,不重覆抽樣將原始數據隨機分為 k 份。第二步,每一次挑選其中 1 份作為測試集,剩餘 k-1 份作為訓練集用於模型訓練。第三步,重覆第二步 k 次,這樣每個子集都有一次機會作為測試集,其餘機會作為訓練集。在每個訓練集上訓練後得到一個模型,用這個模型在相應的測試集上測試,計算並保 ...
  • 用友T3軟體報錯單據的時候提示1105資料庫錯誤 原因分析:客戶使用的是sql2005 express的資料庫,賬套的物理文件達到了4G。 只能重裝SQL的版本,but.... 在window2012的環境下安裝SQL2005的時候遇到了問題,在安裝到一半需要啟動SQL Server服務的時候出現錯 ...
  • MongoDB簡介 MongoDB 是一個基於分散式文件存儲的資料庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。 MongoDB 是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。 MongoDB屬於NoSQL 在高負載 ...
  • 實例:SELECT param->'$.pay' as pay_type FROM game.roominfo; 其中:param是roominfo表的一個欄位,當中存的是JSON字元串,pay是該JSON字元串中的一個key ...
  • 創建如圖所示 查看表結構 查看數據表創建語句 數據表的修改及表數據的修改 ...
  • 【作者】 王棟:攜程技術保障中心資料庫專家,對資料庫疑難問題的排查和資料庫自動化智能化運維工具的開發有強烈的興趣。 【問題描述】 我們生產環境有一組集群的多台MySQL伺服器(MySQL 5.6.21),不定期的會crash,但error log中只記錄了重啟信息,未記錄crash時的堆棧: mys ...
  • -- 創建資料庫 CREATE DATABASE [IF NOT EXISTS] DEFAULT CHARACTER SET utf8; -- 預設字元集為utf8 -- 指定資料庫,作為當前資料庫 USE -- 修改資料庫的字元集 ALTER DATABASE DEFAULT CHARACTER ... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...