android监听wifi
A. android wifi切换路由器怎么监听
第一步:手机的设置:下载超级终端Better Terminal。各大市场应该大把大把的,我是在豌豆荚上下载的。下载完后在手机安装上,点击进入,其中有个选项是开启gui还是shell,对于我们android开发者来说当然是选择比较牛逼的shell了。进入后输入如下内容:
setprop service.adb.tcp.port 5555
stop adbd
start adbd
这样你的手机就配置好了tcpip的网络调试端口了。
第二步:电脑的配置:将手机通过usb连接到电脑上,cmd到你的androidsdk的目录下的platform-tools目录执行:
adb tcpip 5555
将机器上的adb切换为网络模式,后面5555是端口号,当然你也可以写其他端口号,只要你的手机的这个端口号没有被使用就可以了.
第三步:电脑配置:运行cmd,输入
adb connect <你手机IP>:5555
例如:adb connect 10.7.10.3:5555 ,其中10.7.10.3是我的手机的ip地址你输入你的手机的ip地址即可。
如果成功的话,会提示 connected to 10.7.10.3:5555
现在你的电脑就可以通过wifi连接电脑调试了,当然你通过eclipse进行调试也是没问题的。
第四步:当你使用完wifi调试的时候,请连接手机后cmd输入adb usb,切换回usb调试。
B. Android的WiFi功能总结
先进行WiFi权限的声明
<!-- 获取WiFi状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- api <= Android29调用setWifiEnabled -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 定位权限(api >= 23 用于 WIFI扫描)-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
注意:ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION是危险级权限需要使用中还需要动态申请,申请其中一个即可。
WifiManager mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.R) {
Intent panelIntent =new Intent(Settings.Panel.ACTION_WIFI);
startActivityForResult(panelIntent,null);
}else{ mWifiManager.setWifiEnabled(!isEnable);}
可以通过监听系统广播来了解WiFi状态。
WIFI_STATE_CHANGED_ACTION:WiFi开关状态;
SCAN_RESULTS_AVAILABLE_ACTION:WiFi列表变化;
RSSI_CHANGED_ACTION:WiFi信号强度变化。
IntentFilter mFilter =new IntentFilter();
mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
mReceiver =new BroadcastReceiver() {
@Override
public void onReceive(Context context,Intent intent) {
handleEvent(intent);
}
};
registerReceiver(mReceiver, mFilter);
private void handleEvent(Intent intent) {
String action = intent.getAction();
if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
final int wifiState =mWifiManager.getWifiState();
if(wifiState ==WifiManager.WIFI_STATE_ENABLED){
postDelayed(()->{mRefreshLayout.autoRefresh();},1000);
}
}else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) {
}else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
if(System.currentTimeMillis() -mLastUpateWifiRssiTime <1000){//刷新太快
return;
}
}
updateWifiChange();
}
切记:wifistate切换到WifiManager.WIFI_STATE_ENABLED,mWifiManager.isWifiEnabled()需要有个等待时间切换。
3的基础上解析广播应答
private void updateWifiChange() {
final int wifiState =mWifiManager.getWifiState();
switch (wifiState) {
case WifiManager.WIFI_STATE_ENABLED:
ArrayListresults = (ArrayList)mWifiManager.getScanResults();
updateApListView(results);
mWlanSb.setChecked(mWifiManager.isWifiEnabled() );
break;
case WifiManager.WIFI_STATE_ENABLING:
break;
case WifiManager.WIFI_STATE_DISABLING:
mAdapter.clearData();
mWlanSb.setChecked(mWifiManager.isWifiEnabled() );
break;
case WifiManager.WIFI_STATE_DISABLED:
break;
}
}
C. android监听wifi状态改变的广播靠谱吗
1、靠谱,这是android的基本常识!
2、只要wifi的底层驱动和wifi模块没有问题,广播消息不会被其他应用堵塞下,监听wifi状态,都会收到wifi状态改变的消息的!
D. Android 超简单实现网络状态的监听
我们做项目的时候,不可避免的要做网络状态的监听,一般我们都是抽取出一个工具类来实现,比如:
细致的你当然还会再写一个判断网络类型的方法,反手再来一个例:
然后就可以在相应的操作前进行判断网络的判断:
但是这样做也有些问题:
接下来就是本文的重点,如何通过 NetStatusBus 这个库来解决以上问题,让你的网络状态监听变得前所未有的简单粗暴。
到这里就已经结束了,你的所有网络操作已经都可以清晰优雅的在订阅方法中进行处理了,当然你也可以继续往下看。
订阅方法必须填写一个NetType参数,可以通过NetType的值来判断当前网络类型。
@NetSubscribe中 netType为可选值,可以设置订阅的类型,可选值类型如下:
NetType.AUTO
这是默认值,任何网络状态发生变化,该类型订阅者都会被回调。同时会传入NetType参数告知你当前的网络类型,示例如下:
只要当前是由 WIFI 改变引发的网络状态变化,该类型订阅者都会被回调。同时会传入NetType参数告知你当前的网络类型,示例如下:
只要当前是由移动网络改变引发的网络状态变化,该类型订阅者都会被回调。同时会传入NetType参数告知你当前的网络类型,示例如下:
NetType.NONE
只有当网络丢失时,该类型订阅者才会被回调。
有人会觉得,我用个库爽就行了管它的原理干什么?
你放心,我只是小小的描述一下实现方式。
原理简单来说,就是在全局初始化的时候就绑定对网络的变化监听。然后将进行注册的父类所有的订阅方法保存至集合中,这里涉及到一些方法的校验,最后在网络状态发生改变时利用 java 反射机制遍历执行所有订阅方法。熟悉 EventBus 的小伙伴已经看出来了这里借鉴了一小部分 EventBus 的思想。
回到第一步,那么具体是如何绑定对网络状态变化的监听呢?
以前我们是通过注册广播来实现绑定网络变更的监听,在Android 7.0 以后,Google 基于性能和安全原因对广播进行了很多限制,比如监听网络变更的广播 android.net.conn.CONNECTIVITY_CHANGE 使用静态注册的方式则无法生效,而动态注册的方式虽然可以生效但毕竟不是最优解。
同样出于性能和安全,以及拥抱变化的角度,最终我们还是使用官方推荐的方式,利用 ConnectivityManager.NetworkCallback 来进行网络变化的监听,这是在Android 5.0即android api 21推出的API,目前Android 5.0以上的市场占有率在 85%以上,随着国内各大厂商正在积极的推进适配普及Android Q,这个比例还会进一步增大,所以个人人认为无需过于担心低版本适配。
使用的时候出现这个问题是由于少添加了权限。
Caused by: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.
java.lang.RuntimeException: Unable to create application com.jiyun.wanandroid.WanApplication: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.
加上这几个权限就好了:
附上原文地址: https://www.jianshu.com/p/2fea980b3e56
E. Android之WIFI-网络可用性校验(NetworkMonitor)
流程框架
基础知识
源码
细节
1.WifiStateMachine在状态L2ConnectedState时,进行NetworkAgent初始化。
NetworkAgent初始化的过程建立与ConnectivityService通信
2.ConnectivityService的registerNetworkAgent创建NetworkAgentInfo
3.NetworkAgentInfo的初始化,创建NetworkMonitor,而NetworkMonitor则是监听网络的可用性
4.NetworkMonitor
adb控制
问题
参考学习
F. 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测试一下,就行啦!
G. android wifi监听需要哪些action
需要监听以下3个action
<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" />
H. android 监听到wifi状态的广播怎么存储
package com.example.floatdialogtest;
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;
public class WifiReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals(WifiManager.RSSI_CHANGED_ACTION)){
//signal strength changed
}
else if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){//wifi连接上与否
System.out.println("网络状态改变");
NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if(info.getState().equals(NetworkInfo.State.DISCONNECTED)){
System.out.println("wifi网络连接断开");
}
else if(info.getState().equals(NetworkInfo.State.CONNECTED)){
WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
//获取当前wifi名称
System.out.println("连接到网络 " + wifiInfo.getSSID());
}
}
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){
System.out.println("系统关闭wifi");
}
else if(wifistate == WifiManager.WIFI_STATE_ENABLED){
System.out.println("系统开启wifi");
}
}
}
}
I. 【原创】安卓开启WIFI调试
拿手机来调试,一天下来没多久就满电了,怕电池hold不住,找了个远程调试的办法。下面是操作步骤,给有需要的人帮助。
1、手机开启USB调试模式
2、将手机连接到电脑上
3、命令行执行adb tcpip 5555(启动手机上的adbd守护进程,并监听5555端口,默认端口为5555,可使用其它端口)
4、获取手机连接的wifi地址(命令行查看adb shell ip address show wlan0)
5、通过adb connect命令连接
注:adb connect需要和adb tcpip所使用的端口一致,如果不一致,则无法连接到该手机。