<!-- 获取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
}
}
拿手机来调试,一天下来没多久就满电了,怕电池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所使用的端口一致,如果不一致,则无法连接到该手机。
编程时候发现当打开WIFI网络的时候系统默认就会把3G网络给关闭,估计是出于省电的原因才如此做的,但目前我需要同时使用这两个网络接口,经过一番研究找到了方法,故写成日志记录下来。
1、android网络机制。谈咐
wifi的开启关闭首先由应用程序触发的事件开始(比如用户点击开启图标),然后传入framework层,framework层启动wpa_supplicant,同时建立socket连接与wpa_supplicant进行通信,包括对wpa_supplicant的控制与得到wpa_supplicant的回传结果。若连接上了一个无线网络,则调用dhcp服务申请ip地址(或者使用启碧预先设置好的ip,不过大部分情况下是dhcp的)。若这一切正常则断开3g网络连接并关闭3g接口。
因此从这个角度分析,若要同时启动3g和wifi则必须绕过framework层,手动完成上述所有 *** 作。
因此我找到含旁纯的方法是在3g网络不断的情况下,手动启动wifi网络,连接指定ap并申请ip。
2、 *** 作步骤。
(1) 准备工作
因为牵扯到底层 *** 作,所以root必不可少,在root的情况下进入adb shell,若adb daemon没有root使用adb root命令进而使adb shell获得root权限。
原则上使用android里的终端软件也是可以的,但我没有测试。
(2)加载wifi驱动。
不加载驱动在netcfg里面根本看不到wlan0网卡,因此首先要加载驱动。
一般情况下,驱动放在/system/lib/modules下,我的驱动模块是wlan.ko。
insmod /system/lib/modules/wlan.ko。
接着删除默认路由表项
ip route del default via 172.18.206.76 dev rmnet_usb0
重新添加指向wifi的默认路由表
ip route add default via 192.168.1.140 dev wlan0
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)