android wifi讲解 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;
        }  

    }  

}  

程序运行效果图如下:

时间: 2024-08-12 00:49:47

android wifi讲解 wifi列表显示的相关文章

Android中的WiFi P2P

Android中的WiFi P2P能够允许一定范围内的设备通过Wifi直接互连而不必通过热点或互联网. 使用WiFi P2P需要Android API Level >= 14才可以,而且不要忘记在Manifest文件中加入下面5个权限: ● android.permission.ACCESS_WIFI_STATE ● android.permission.CHANGE_WIFI_STATE ● android.permission.ACCESS_NETWORK_STATE ● android.p

Android附近基站+Wifi+IP+GPS多渠道定位方案

前言: 在移动客户端的开发中,地理位置定位是一个非常重要的环节,有些时候用户可能会限制web app或者Android app的一些权限,或者由于信号不佳的原因无法获得准确的GPS位置,甚至为了省电,用户可能对开启GPS开关可能会有抵触情绪.但是不能因为GPS的种种限制就放弃了对用户位置的追踪.要通过一切能发送出信号的物体尽可能准确的获取到用户的位置,有时可以牺牲一些精度,对于大数据和用户地区分布分析来说,有一个大体的位置已经够分析人员使用,而且绕开GPS的重重壁垒,为数据的完整性提供可靠方案

Android代码连接Wifi时被系统切换到其他Wifi的问题

首先说下Android代码连接Wifi的几个步骤:(以下涉及到具体API函数自查哈,写的时候凭借印象大致写了下) 转载请注明出处: 胖虎:http://blog.csdn.net/ljphhj 1.首先要开启Wifi连接开关,mWifiManager.setWifiEnabled(true) 2.通过获取List<ScanResult>来获取到Wifi连接列表.(mWifiManager.getScanResults) 3.获取List<WifiConfiguration>列表.(

Android 4.2 Wifi Display 之 Settings 源码分析(一)

一.简单背景 简单背景:随着无线互联的深入,不管是蓝牙.WIFI或者各种基于此的规范不管是UPNP还是DLNA都随着用户的需求得到了很大的发展,google 自从android 4.0引入wifi direct后,又在11月份公布的android 4.2中引入了Miracast无线显示共享,其协议在此可以下载.具体的协议部分内容比较多,本人由于水平有限,就不在这里罗列协议的内容了,只附上一份架构图供大家对其有个大致的印象. 英文缩写对应如下: HIDC: Human Interface Devi

Android 查看 无wifi/usb设备的logcat方法

Android 查看 无wifi/usb设备的logcat方法 一.情况 一个定制Android设备,wifi被去掉,我需要调试一个USB设备这样也无法用usb来输出logcat. 因为这个USB设备需要内核驱动支持,因此无法在其它设备调试. 因此有的方法有,一般想到用蓝牙输出logcat,但这是Android wear 才支持的特性. 在代码中加入捕获错误和异常代码,写入sd卡,这个工作量较大,而且麻烦 二.简单的解决办法 1.安装Android Terminal 软件. 一个可用链接是 ht

马上搞定Android平台的Wi-Fi Direct开发

导语 移动互联网时代,很多用户趋向于将大量的资料保存在移动设备上.但在给用户带来便利的同时引发了一个新的问题——保存在移动设备上的资料该怎样共享出去?到了思考时间,普通青年这样想:折腾什么劲啊,直接用数据线不就行了:而文艺青年可能这样想:咱们建个群吧,大家有好的东西都可以共享:二逼青年不高兴了,都特么互联网时代了,来点新意,好么?直接上网盘啊,大家互相研究研究,你懂的,嘿嘿.然而我是这样想的:都特么别BB,技术要以时俱进,来个新潮点的不行么?直接上Wi-Fi Direct.好用简单不解释.那么我

Android连接指定Wifi的方法

本篇博客主要记录一下Android中打开Wifi.获取Wifi接入点信息及连接指接入点的方法. 自己写的demo主要用于测试接口的基本功能,因此界面及底层逻辑比较粗糙. demo的整体界面如下所示: 上图中的OPEN按键负责开启Wifi: GET按键负责获取扫描到的接入点信息. 当获取到接入点信息后,我选取了其中的名称及信号强度,以列表的形式显示在主界面下方,如下图: 当点击列表中的Item时,就会去连接对应的接入点. 自己的逻辑比较简单,测试时的代码,假定连接的是不许要密码或密码已知的接入点.

[android开发篇][ wifi模块] [2] wifibase

package com.softwinner.network.wifi; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration;

S3c6410 平台 Android系统的Wi-Fi调试记录

硬件平台:S3c6410 操作系统:Android 网卡芯片:GH381(SDIO接口 sdio8688) 1.SDIO驱动 因为是SDIO接口,所以请先保证mmc驱动(代码在“kernel\drivers\mmc”)部分能够正常工作,这个一般调试flash的时候会涉及到,问题不大,因为S3c6410平台的HSMMC有3个,要根据硬件原理图确认网卡的SDIO接口接在哪个上面了,我调试的时候是HSMMC1,针对HSMMC1涉及到的修改有 ① "kernel\arch\arm\configs\smd