Android的WiFi功能总结

Android的WiFi功能总结,第1张

先进行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

}

}

手机来调试,一天下来没多久就满电了,怕电池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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12217801.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存