在做的项目中需要显示一个WIFI状态的图标,与系统通知栏里的类似,要求动态显示WIFI信号,状态. Wifi在信号改变,开关以及状态改变时都会发送广播,我们接收这几个广播即可. 需要权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Wifi图标这里,我用了一个ImageView,使用level-list来在信号改变时切换显示的图片:
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:maxLevel="0"
android:drawable="@drawable/stateitems_wifi_0"
android:minLevel="0"/>
<item
android:drawable="@drawable/stateitems_wifi_1"
android:maxLevel="1"
android:minLevel="1"/>
<item
android:drawable="@drawable/stateitems_wifi_2"
android:maxLevel="2"
android:minLevel="2"/>
<item
android:drawable="@drawable/stateitems_wifi_3"
android:maxLevel="3"
android:minLevel="3"/>
<item
android:drawable="@drawable/stateitems_wifi_4"
android:maxLevel="4"
android:minLevel="4"/>
</level-list>
但好像有个问题,在返回信号3时,显示的是4,满格信号,2的时候,显示的3格信号不知道问题出在哪,我确定图片没有弄错. 广播接收器:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.widget.ImageView;
public class WifiStateReceiver extends BroadcastReceiver {
ImageView wifiStateImage;
Context context;
public WifiStateReceiver(Context context, ImageView imageView) {
// TODO Auto-generated constructor stub
this.wifiStateImage=imageView;
this.context=context;
int strength=getStrength(context);
wifiStateImage.setImageLevel(strength);
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println(intent.getAction());
if(intent.getAction().equals(WifiManager.RSSI_CHANGED_ACTION))
{
int strength=getStrength(context);
System.out.println("当前信号 "+strength);
wifiStateImage.setImageLevel(strength);
}else if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){
System.out.println("网络状态改变");
NetworkInfo info=intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if(info.getState().equals(NetworkInfo.State.DISCONNECTED))
{//如果断开连接
wifiStateImage.setImageLevel(0);
}
}else if(intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION))
{
//WIFI开关
int wifistate=intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,WifiManager.WIFI_STATE_DISABLED);
if(wifistate==WifiManager.WIFI_STATE_DISABLED)
{//如果关闭
wifiStateImage.setImageLevel(0);
}
}
}
public int getStrength(Context context)
{
WifiManager wifiManager = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo();
if (info.getBSSID() != null) {
int strength = WifiManager.calculateSignalLevel(info.getRssi(), 5);
// 链接速度
// int speed = info.getLinkSpeed();
// // 链接速度单位
// String units = WifiInfo.LINK_SPEED_UNITS;
// // Wifi源名称
// String ssid = info.getSSID();
return strength;
}
return 0;
}
}
注册广播接收器:
//WIFI状态接收器
WifiStateReceiver wifiReceiver=new WifiStateReceiver(this,wifi_state);
IntentFilter filter=new IntentFilter();
filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
this.registerReceiver(wifiReceiver,filter);
要加上三个Action