导航:首页 > 操作系统 > android监听wifi连接

android监听wifi连接

发布时间:2023-03-17 16:57:12

android manager wifi 怎么用

获取Wifi的控制类WifiManager。
WifiManager wm=(WifiManager)getSystemService(Context.WIFI_SERVICE);
接下来可以对wifi操作了,比如要打开、关闭wifi,可以通过WifiManager的setWifiEnabled()方法来开关wifi。
若要查看一些信息,可以通过getConnectionInfo()方法得到WifiInfo类的对象,WifiInfo类里主要提供手机wifi上面存储的连接信息。
WifiInfo类方法:
1、getBSSID() 获取接入点的mac地址(String)
2、getIpAddress() 获取本机的IP地址 (int)
3、getLinkSpeed() 获取连接速度(不是下载速度),单位为Mbps (int)
4、getMacAddress() 获取mac地址 (String)
5、getNetworkId() 获取网络id号。每一个设定好了的网络都有一个独一无二的整数型ID号,用来识别网络,当操作请求时(翻译)。简而言之,就是这个号就是代表一个连接点,手机可以通过wifi连接很多无线网的。
6、getRssi() 返回收到的信号强度,是个负数。(好像到-113就表示一点信号都没有,也就是说数越大信号就越好)
7、getSSID() 获取无线信号提供者的名称 (就是要连的网络的名字)(String)
上面那个类只能查到本机的mac地址与ip,要只查看本机的详细信息,可以通过这个类:DhcpInfo df=wm.getDhcpInfo();
DhcpInfo类没什么方法,提供了一些字段:
1、dns1 第一个DNS
2、dns2 如上
3、gateway 网关
4、ipAddress IP地址
5、netmask 子网掩码
6、serverAddress 服务端地址(其实就是路由器ip,和网关一样)
7、leaseDuration 和上面的getLinkSpeed() 方法的值接近,可能是连接速度,不过单位不是Mbps,getLinkSpeed() 得到72,这个字段的值是7200

上面的IP与网关、子网掩码等都是int型数值,直接看看不懂,附上一个我写的方法把int转成String类型。

private String intToString(int a){
StringBuffer sb=new StringBuffer();
int b=(a>>0)&0xff;
sb.append(b+".");
b=(a>>8)&0xff;
sb.append(b+".");
b=(a>>16)&0xff;
sb.append(b+".");
b=(a>>24)&0xff;
sb.append(b);
return sb.toString();
}

WifiConfiguration 类主要提供一个wifi配置的所有信息
有如下字段(自己明白的不一定正确):
BSSID 接入点的mac地址。
SSID 接入点的名字。
networkId 网络号
preSharedKey WPA-PSK密码,如果有就会得到一个*(这玩意就是判断是不是有密码的)
priority 优先级
status 连接状态,值是WifiConfiguration.Status中字段的一种。

WifiConfiguration.Status 提供了3个字段表示wifi连接的三种状态
1.CURRENT 值为0,表示处于连接状态
2.DISABLED 值为1,表示网络不可用
3. ENABLED 值为2,表示网络可用但没连接

ScanResult wifi扫描到的接入点信息
1.BSSID
2.SSID
3.capabilities
4.frequency
5.level

关于接收WIFI状态改变接收广播信息:

ACTION: WifiManager.WIFI_STATE_CHANGED_ACTION ( "android.net.wifi.WIFI_STATE_CHANGED")wifi状态变化触发,触发两次。

可接收两个信息:(键) (这个是监听wifi状态变化的,wifi状态变化并不包括wifi的连接状态,只是单纯的指示wifi的5种状态)

1. WifiManager.EXTRA_PREVIOUS_WIFI_STATE("previous_wifi_state") int型值 intent.getIntExtra("键",0);(第二个为得不到时的默认值)

2. WifiManager.EXTRA_WIFI_STATE("wifi_state") int型值 intent.getIntExtra("键",0);(第二个为得不到时的默认值)

ACTION: WifiManager.NETWORK_STATE_CHANGED_ACTION("android.net.wifi.STATE_CHANGE")wifi连接网络的状态广播,连接过程中接收多次,在连接过程中可与获取NetworkInfo对象,通过ni.getState()可以获取wifi连接状态。如果连接state处于connected状态,可以通过WifiManager.EXTRA_WIFI_INFO得到wifiInfo对象。(不重要细节:测试时发现 下面isconnected()方法为true时,这个广播还处于connecting状态,再一次广播才变成connected)

可接收两个信息:(键)

1. WifiManager.EXTRA_BSSID("bssid") String类型值 intent.getStringExtra("键")

2. WifiManager.EXTRA_NETWORK_INFO("networkInfo") T getParcelableExtra(“键”)

ACTION: WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION( "android.net.wifi.supplicant.CONNECTION_CHANGE") 判断是否WIFI打开了,变化触发一次

可接收一个信息:(键)(这个应该是广播wifi启动状态的,true表示连接到wifi设备,一般在wifi state处于enable时得到,false则表示断开设备连接,wifi此时状态为disabling。这只是指机器内的wifi连接状态变化,与网络无关)

1. WifiManager.EXTRA_SUPPLICANT_CONNECTED("connected") boolean类型返回值 intent.getBooleanExtra(“键”, true)第二个是默认值

ACTION: WifiManager.SUPPLICANT_STATE_CHANGED_ACTION("android.net.wifi.supplicant.STATE_CHANGE")发送WIFI连接的过程信息,如果出错ERROR信息才会收到。连接WIFI时触发,触发多次。

可接收两个信息:(键)

1. WifiManager.EXTRA_NEW_STATE("newState") intent.getParcelableExtra("键")

2. WifiManager.EXTRA_SUPPLICANT_ERROR("supplicantError") int型值 getIntExtra(“键”, int)

WIFI状态int值对应的状态:

WifiManager.WIFI_STATE_DISABLED ==1

WifiManager.WIFI_STATE_DISABLING ==0

WifiManager. WIFI_STATE_ENABLED==3

WifiManager. WIFI_STATE_ENABLING==2

WifiManager. WIFI_STATE_UNKNOWN==4

上面的是在有wifi的环境下测的,没在没WIFI的环境下测,不一定准,但差不多了。测试机型HTC G17。

如果在连接WIFI的过程中(Connecting),去连接网络地址(比如http://www..com)会得到找不到地址的异常,并且在8秒左右之内(就测了一台定制机),不能连接这一地址,否则报找不到地址异常。

这个包并不判断网络连接状态,只是判断wifi的各种状态,如果需要判断网络状态, 在android.net包中。ConnectivityManager 。

//判断WIFI是否连接
private boolean isConnected(Context context){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
System.out.println(ni.getState());
System.out.println(ni.getDetailedState()+"-----");
if(ni != null && ni.getState()==State.CONNECTED)
return true;
return false;
}

private boolean isWifiConected(Context context) {
WifiManager wm = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
List<WifiConfiguration> list = wm.getConfiguredNetworks();
Iterator<WifiConfiguration> it = list.iterator();
while (it.hasNext()) {
WifiConfiguration wc = it.next();
if (wc.status == WifiConfiguration.Status.CURRENT)
return true;
}
return false;
}//2012.11.12在4.0机器上发现这个方法一直返回false,估计我理解错了,不要用。

WifiInfo不为空并不代表这个类里面就存了信息,getMacAdress可能为空。

public String getMac() {
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wi = wm.getConnectionInfo();
if(wi == null)
return null;
return wi.getMacAddress();
}

② Android:通过WifiManager监听Wifi信号强弱

先来了解下Android如何获取wifi的信息:

WifiManager wifi_service = (WifiManager)getSystemService(WIFI_SERVICE);

WifiInfo wifiInfo = wifi_service.getConnectionInfo();

其中WifiManager是管理wifi的最重要的类,详细请参考

http://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:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >

    <ImageView

        android:id="@+id/wifi_image"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_marginLeft="145dp"

        android:layout_gravity="center" />

</LinearLayout>

用于获得信号强度并改变图片的Activity:MainActivity

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.scheleAtFixedRate(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测试一下,就行啦!

③ android 代码怎么实时监控连接当前wifi热点的设备的连接或断开事件

请参考以下代码实现监控:
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobNetInfo = connectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiNetInfo = connectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
// BSToast.showLong(context, "网络不可以用");
// 改变背景或者 处理网络的全局变量
} else {
// 改变背景或者 处理网络的全局变量
}
把上的代码放到一个广播里面。。

④ android wifi正在连接的状态广播

很多时候我们都需要实时监听网络状态,当网络状态发生变化之后立即通知程序进行不同的操作。
监听广播的两种方式:
(1)在AndroidManifest.xml配置文件中声明
<receiver android:name=".NetworkConnectChangedReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
<action android:name="android.net.wifi.STATE_CHANGE" />
</intent-filter>
</receiver>1234567

(2)在代码中注册
IntentFilter filter = new IntentFilter(); filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(new NetworkConnectChangedReceiver(), filter);12345

接下来创建实时监听网络连接与断开状态变化的BroadcastReceiver对象,我们需要继承android.content.BroadcastReceiver,并实现其onReceive方法,下面我们就创建一个名为NetworkConnectChangedReceiver广播接收者,看一下具体的实现代码,由于代码写得很详细,就不一一解释了
package com.per.networkconnectdome;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.net.wifi.WifiManager;import android.os.Parcelable;import android.util.Log;public class NetworkConnectChangedReceiver extends BroadcastReceiver {
private String getConnectionType(int type) {
String connType = ""; if (type == ConnectivityManager.TYPE_MOBILE) {
connType = "3G网络数据";
} else if (type == ConnectivityManager.TYPE_WIFI) {
connType = "WIFI网络";
} return connType;
} @Override
public void onReceive(Context context, Intent intent) { if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {// 监听wifi的打开与关闭,与wifi的连接无关
int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
Log.e("TAG", "wifiState:" + wifiState); switch (wifiState) { case WifiManager.WIFI_STATE_DISABLED: break; case WifiManager.WIFI_STATE_DISABLING: break;
}
} // 监听wifi的连接状态即是否连上了一个有效无线路由
if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
Parcelable parcelableExtra = intent
.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if (null != parcelableExtra) { // 获取联网状态的NetWorkInfo对象
NetworkInfo networkInfo = (NetworkInfo) parcelableExtra; //获取的State对象则代表着连接成功与否等状态
NetworkInfo.State state = networkInfo.getState(); //判断网络是否已经连接
boolean isConnected = state == NetworkInfo.State.CONNECTED;
Log.e("TAG", "isConnected:" + isConnected); if (isConnected) {
} else {

}
}
} // 监听网络连接,包括wifi和移动数据的打开和关闭,以及连接上可用的连接都会接到监听
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { //获取联网状态的NetworkInfo对象
NetworkInfo info = intent
.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); if (info != null) { //如果当前的网络连接成功并且网络连接可用
if (NetworkInfo.State.CONNECTED == info.getState() && info.isAvailable()) { if (info.getType() == ConnectivityManager.TYPE_WIFI
|| info.getType() == ConnectivityManager.TYPE_MOBILE) {
Log.i("TAG", getConnectionType(info.getType()) + "连上");
}
} else {
Log.i("TAG", getConnectionType(info.getType()) + "断开");
}
}
}
}
}

在onReceive方法里面,我们可以获取从广播而来的Intent中的数据,这包含很多有用的信息,其中
ConnectivityManager : 主要管理和网络连接相关的操作
WifiManager: 管理和wifi相关的信息
TelephonyManager: 管理和手机、运营商等的相关信息
NetworkInfo类包含了对wifi和mobile两种网络模式连接的详细描述,通过getState()方法获取的State对象,代表着连接成功与否的状态。
最后记得添加权限:
<uses-permission android:name="android.permission.access_wifi_state" /><uses-permission android:name="android.permission.access_network_state" />

⑤ Android监听网络状态框架

就这么简单,让我们开始吧。

看下最终实现的使用:

日志:

好了,新建一个AndroidLibray开始实现。

权限走一波:

首先,咱们需要一个监听网络状态的工具类

在lib中创建一个广播,然后再配置文件里注册一下。

完善下咱们的receiver:

监听接口:

manager:

再加上一个枚举类:

OK,一套正常操作,一个最普通网络监听类写完了。接着咱们尝试用注解,让这个小框架看的有档次些。

完善一下自定义注解:

然后来捋一下思路:

照样是固定三部曲,按照步骤来:

1.先完善我们的注册方法

在这里,我创建了一个方法封装类。比较简单: MethodManager

这里的 mMethodList 是方法封装类(MethodManager)的List,用来存储筛选后的MainActivity中方法,也就是网络监听方法。以下是方法的筛选:

咱们定义一个post方法,去完成这项工作:

这里实现了通过网络监听注解上方的参数,我们可以单独监听某一种网络状态的变化。比如

上方参数表明,只有在WIFI断开和连接的时候,方法才会做出响应。想要所有提示设置为AUTO就行啦。

OK,做完逻辑以后执行一下:

大功告成!跑一下看看效果!

项目地址: https://github.com/CocoYuki/NetListener

是一个练手的小项目,实际网络请求在7.0时就能通过一个CallBack轻松搞定了。

阅读全文

与android监听wifi连接相关的资料

热点内容
安卓怎么关权限保护隐私 浏览:390
海牛微视app怎么用 浏览:70
单片机怎样选变压器 浏览:829
癌症pdf 浏览:725
云服务器镜像批量部署环境 浏览:683
安卓手机浏览器能访问什么网站 浏览:254
找不到网站的服务器ip地址该如何解决 浏览:743
算法十个数降序排列 浏览:95
基于单片机的老年人健康监测系统 浏览:706
python入门经典pdf下载 浏览:17
东芝变频2p空调压缩机 浏览:227
自家wifi怎么能加密 浏览:644
红米k40加密门禁卡 浏览:847
什么样的源码好看 浏览:156
手机主服务器有什么用 浏览:612
程序编写命令 浏览:597
android发送心跳包 浏览:385
指标源码和原理 浏览:700
汽车空调压缩吸盘 浏览:208
崽崽因app版本不同不能邀请怎么办 浏览:686