Android:通過WifiManager監聽Wifi信號強弱

Android:通過WifiManager監聽Wifi信號強弱。

先來瞭解下Android如何獲取wifi的信息:
WifiManager wifi_service = (WifiManager)getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifi_service.getConnectionInfo();

其中WifiManager是管理wifi的最重要的類,詳細請參考
https://developer.android.com/reference/android/net/wifi/WifiManager.html
其中wifiInfo有以下的方法:
wifiinfo.getBSSID();
wifiinfo.getSSID();
wifiinfo.getIpAddress();獲取IP地址。
wifiinfo.getMacAddress();獲取MAC地址。
wifiinfo.getNetworkId();獲取網絡ID。
wifiinfo.getLinkSpeed();獲取連接速度,可以讓用戶獲知這一信息。
wifiinfo.getRssi();獲取RSSI,RSSI就是接受信號強度指示。在這可以直 接和華為提供的Wi-Fi信號閾值進行比較來提供給用戶,讓用戶對網絡或地理位置做出調整來獲得最好的連接效果。
這裡得到信號強度就靠wifiinfo.getRssi();這個方法。得到的值是一個0到-100的區間值,是一個int型數據,其中0到-50表示信號最好,-50到-70表示信號偏差,小於-70表示最差,有可能連接不上或者掉線,一般Wifi已斷則值為-200。

界面很簡單,隻有一個ImageView用來顯示圖片,activity_main.xml:
[html] view plain copy print?
android:layout_width="match_parent"
android:layout_height="match_parent" >

android:id="@+id/wifi_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="145dp"
android:layout_gravity="center" />

用於獲得信號強度並改變圖片的Activity:MainActivity
[java] view plain copy print?
package com.my.phonesingle;

import java.util.Timer;
import java.util.TimerTask;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {
private WifiInfo wifiInfo = null; //獲得的Wifi信息
private WifiManager wifiManager = null; //Wifi管理器
private Handler handler;
private ImageView wifi_image; //信號圖片顯示
private int level; //信號強度值

@SuppressLint("HandlerLeak")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//圖片控件初始化
wifi_image = (ImageView) findViewById(R.id.wifi_image);
// 獲得WifiManager
wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
// 使用定時器,每隔5秒獲得一次信號強度值
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
wifiInfo = wifiManager.getConnectionInfo();
//獲得信號強度值
level = wifiInfo.getRssi();
//根據獲得的信號強度發送信息
if (level <= 0 && level >= -50) {
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
} else if (level < -50 && level >= -70) {
Message msg = new Message();
msg.what = 2;
handler.sendMessage(msg);
} else if (level < -70 && level >= -80) {
Message msg = new Message();
msg.what = 3;
handler.sendMessage(msg);
} else if (level < -80 && level >= -100) {
Message msg = new Message();
msg.what = 4;
handler.sendMessage(msg);
} else {
Message msg = new Message();
msg.what = 5;
handler.sendMessage(msg);
}

}

}, 1000, 5000);
// 使用Handler實現UI線程與Timer線程之間的信息傳遞,每5秒告訴UI線程獲得wifiInto
handler = new Handler() {

@Override
public void handleMessage(Message msg) {
switch (msg.what) {
// 如果收到正確的消息就獲取WifiInfo,改變圖片並顯示信號強度
case 1:
wifi_image.setImageResource(R.drawable.single4);
Toast.makeText(MainActivity.this,
"信號強度:" + level + " 信號最好", Toast.LENGTH_SHORT)
.show();
break;
case 2:
wifi_image.setImageResource(R.drawable.single3);
Toast.makeText(MainActivity.this,
"信號強度:" + level + " 信號較好", Toast.LENGTH_SHORT)
.show();
break;
case 3:
wifi_image.setImageResource(R.drawable.single2);
Toast.makeText(MainActivity.this,
"信號強度:" + level + " 信號一般", Toast.LENGTH_SHORT)
.show();
break;
case 4:
wifi_image.setImageResource(R.drawable.single1);
Toast.makeText(MainActivity.this,
"信號強度:" + level + " 信號較差", Toast.LENGTH_SHORT)
.show();
break;
case 5:
wifi_image.setImageResource(R.drawable.single0);
Toast.makeText(MainActivity.this,
"信號強度:" + level + " 無信號", Toast.LENGTH_SHORT)
.show();
break;
default:
//以防萬一
wifi_image.setImageResource(R.drawable.single0);
Toast.makeText(MainActivity.this, "無信號",
Toast.LENGTH_SHORT).show();
}
}

};

}
}
然後隻需要打開Wifi測試一下,就行啦!

You May Also Like