android wifi讲解 wifi列表显示

尊重个人劳动成果,转载请注明出处:http://blog.csdn.net/cshichao/article/details/13293623

源码下载http://download.csdn.net/detail/caoshichao520326/6465715

最近项目中用到了wifi模块,今天做一个简单的总结。

1.怎样获取wifi对象并进行操作

要操作WIFI设备,需要先获取Context.getSystemService(Context.WIFI_SERVICE)来获取WifiManager对象,并通过这个对象来管理WIFI设备。

  • addNetwork(WifiConfiguration config) 添加一个config描述的WIFI网络,默认情况下,这个WIFI网络是DISABLE状态的。
  • calculateSignalLevel(int rssi , int numLevels) 计算信号的等级
  • compareSignalLevel(int rssiA, int rssiB) 对比网络A和网络B的信号强度
  • createWifiLock(int lockType, String tag) 创建一个WIFI 锁,锁定当前的WIFI连接
  • disableNetwork(int netId) 让一个网络连接失效
  • disconnect() 断开当前的WIFI连接
  • enableNetwork(int netId, Boolean disableOthers) 连接netId所指的WIFI网络,并是其他的网络都被禁用
  • getConfiguredNetworks() 获取网络连接的状态
  • getConnectionInfo() 获取当前连接的信息
  • getDhcpInfo() 获取DHCP 的信息
  • getScanResulats() 获取扫描测试的结果
  • getWifiState() 获取当前WIFI设备的状态
  • isWifiEnabled() 判断WIFI设备是否打开
  • pingSupplicant() ping操作,和PC的ping操作相同作用
  • ressociate() 重新连接WIFI网络,即使该网络是已经被连接上的
  • reconnect() 重新连接一个未连接上的WIFI网络
  • removeNetwork() 移除某一个网络
  • saveConfiguration() 保留一个配置信息
  • setWifiEnabled() 让一个连接有效
  • startScan() 开始扫描
  • updateNetwork(WifiConfiguration config) 更新一个网络连接

2.常用的wifi状态

  • WIFI_STATE_DISABLED WIFI网卡不可用 
  • WIFI_STATE_DISABLING WIFI网卡正在关闭 
  • WIFI_STATE_ENABLED WIFI网卡可用 
  • WIFI_STATE_ENABLING WIFI网卡正在打开 
  • WIFI_STATE_UNKNOWN WIFI网卡状态不可知

3.列表查看有连接信号的wifi热点

ScanResult对象就是用来表示附近wifi热点的属性的,可以通过WifiManager.getScanResults()返回一个ScanResult列表,后面我附上查看附近wifi热点的demo,ScanResult的重要属性有一下几个:

  • BSSID 接入点的地址
  • SSID 网络的名字,唯一区别WIFI网络的名字
  • Capabilities 网络接入的性能
  • Frequency 当前WIFI设备附近热点的频率(MHz)
  • Level 所发现的WIFI网络信号强度

4.连接wifi热点

通过WifiManager.getConfiguredNetworks()方法会返回WifiConfiguration对象的列表,然后再调用WifiManager.enableNetwork();方法就可以连接上指定的热点。

5.查看已经连接上的wifi信息

WifiInfo是专门用来表示连接的对象,这个对象可以通过WifiManager.getConnectionInfo()来获取。WifiInfo中包含了当前连接中的相关信息。

  • getBSSID() 获取BSSID属性
  • getDetailedStateOf() 获取客户端的连通性
  • getHiddenSSID() 获取SSID 是否被隐藏
  • getIpAddress() 获取IP 地址
  • getLinkSpeed() 获取连接的速度
  • getMacAddress() 获取Mac 地址
  • getRssi() 获取802.11n 网络的信号
  • getSSID() 获取SSID
  • getSupplicanState() 获取具体客户端状态的信息

在wifi操作中常用的类和方法就这些,下面给出一个列表显示wifi热点的demo。


1.activity的布局很简单就是一个ListView,activity_wifi_list.xml内容如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".WifiListActivity" >

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</RelativeLayout>
2.ListView的item布局文件item_wifi_list.xml内容如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView"
        android:layout_marginBottom="14dp"
        android:layout_toRightOf="@+id/imageView"
        android:text="TextView" />

    <TextView
        android:id="@+id/signal_strenth"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView"
        android:layout_alignBottom="@+id/textView"
        android:layout_alignParentRight="true"
        android:text="TextView" />

</RelativeLayout>
3.下面就activity的代码了,这里需要自己自定义列表。

public class WifiListActivity extends Activity {

	private WifiManager wifiManager;
	List<ScanResult> list;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_wifi_list);
		init();
	}

	private void init() {
		wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
		openWifi();
		list = wifiManager.getScanResults();
		ListView listView = (ListView) findViewById(R.id.listView);
		if (list == null) {
			Toast.makeText(this, "wifi未打开!", Toast.LENGTH_LONG).show();
		}else {
			listView.setAdapter(new MyAdapter(this,list));
		}
		
	}
	
	/**
	 *  打开WIFI
	 */
	private void openWifi() {
	   if (!wifiManager.isWifiEnabled()) {
	    wifiManager.setWifiEnabled(true);
	   }
	  
	}

	public class MyAdapter extends BaseAdapter {

		LayoutInflater inflater;
		List<ScanResult> list;
		public MyAdapter(Context context, List<ScanResult> list) {
			// TODO Auto-generated constructor stub
			this.inflater = LayoutInflater.from(context);
			this.list = list;
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return list.size();
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			View view = null;
			view = inflater.inflate(R.layout.item_wifi_list, null);
			ScanResult scanResult = list.get(position);
			TextView textView = (TextView) view.findViewById(R.id.textView);
			textView.setText(scanResult.SSID);
			TextView signalStrenth = (TextView) view.findViewById(R.id.signal_strenth);
			signalStrenth.setText(String.valueOf(Math.abs(scanResult.level)));
			ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
			//判断信号强度,显示对应的指示图标
			if (Math.abs(scanResult.level) > 100) {
				imageView.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_wifi_signal_0));
			} else if (Math.abs(scanResult.level) > 80) {
				imageView.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_wifi_signal_1));
			} else if (Math.abs(scanResult.level) > 70) {
				imageView.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_wifi_signal_1));
			} else if (Math.abs(scanResult.level) > 60) {
				imageView.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_wifi_signal_2));
			} else if (Math.abs(scanResult.level) > 50) {
				imageView.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_wifi_signal_3));
			} else {
				imageView.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_wifi_signal_4));
			}
			return view;
		}

	}

}

程序运行效果图如下:


代码比较简单易懂,就没有写太多注释。

源码下载:http://download.csdn.net/detail/caoshichao520326/6465715

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值