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"/>
- 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>
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 }