你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
首页
热门
推荐
精选
登录
|
注册
Android8.0及以上系统 WiFi热点 版本适配
立即下载
用AI写一个
金额:
5
元
支付方式:
友情提醒:源码购买后不支持退换货
立即支付
我要免费下载
发布时间:2018-08-28
146人
|
浏览:14148次
|
收藏
|
分享
技术:Android8.0
运行环境:Android8.1、Android8.0
概述
Android 8.0及以上系统的Wifi热点开启关闭功能。
详细
###一、准备工作 开发环境: jdk1.8 AS(3.0.1) 运行环境: 华为V10(Android8.0)、华为p20(Android8.1)、华为mate10(Android8.1.0)、OnePlus 5T(Android8.1.0) 实现功能: Wifi热点的开启关闭。 ### 二、代码结构 ![工程目录](/contentImages/image/20180828/f69WNTsmsRtkJb4unfT.png) ### 三、代码详解 [Android 7.0及以前Wifi热点 ](https://blog.csdn.net/VNanyesheshou/article/details/50812271) [Android 8.1、8.0Wifi热点](https://blog.csdn.net/VNanyesheshou/article/details/82147110 "Android 8.1、8.0Wifi热点") 最近发现Android8.0以上的手机开启Wifi热点后不能正常使用,故研究了一下如何解决次问题。 #### Android 7.0 开启Wifi热点 在Android7.0及以前的版本开启Wifi热点的方式如下: ``` WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); Method method = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); //反射 method.invoke(mWifiManager, null, false); ``` ------------------- #### Android 8.0 开启Wifi热点 对于Android8.0及以上的设备,通过WifiManager setWifiApEnabled,可以打开Wifi热点,但是会发现此热点,连接不上(由于DHCP没有开启),所以不会分配ip地址,也就导致不能正常使用。 在Android8.0系统应用Settings,发现其开启热点的方式是通过ConnectivityManager的startTethering方法来开启的。 查看ConnectivityManager的方法 ![三个参数](/contentImages/image/20180828/8iOZlUNqJ3Hl67CLar7.png "三个参数") ![四个参数](/contentImages/image/20180828/dpAbh2aksTQwvvhuEhd.png "四个参数") startTethering 是隐藏的方法,并且第三个参数OnStartTetheringCallback是ConnectivityManager内部抽象类,也是隐藏的。 ``` /** * Callback for use with {@link #startTethering} to find out whether tethering succeeded. * @hide */ @SystemApi public static abstract class OnStartTetheringCallback { /** * Called when tethering has been successfully started. */ public void onTetheringStarted() {}; /** * Called when starting tethering failed. */ public void onTetheringFailed() {}; } ``` 通过反射的方式并没有找到方式获取startTethering方法,以及创建OnStartTetheringCallback子对象。 后来通过另一种方式实现了。 ##### 配置jar包 首先修改ConnectivityManager源码,将TETHERING_WIFI字段、startTethering方法及OnStartTetheringCallback类中隐藏相关的标志去掉,然后单独编译一个jar包。 将jar包拷贝到工程中,如下所示: ![wifiap jar包](/contentImages/image/20180828/VNTkOsme0wTnNrUhOWO.png "wifiap jar包") 该jar包会和官方sdk中的android.jar会有冲突,所以需要配置jar包的优先级。 在app的build.gradle中配置 ``` provided files('src/main/libs/WifiAp8.jar') ``` 在工程下的build.gradle中添加如下配置: ``` allprojects { gradle.projectsEvaluated { tasks.withType(JavaCompile) { //设置jar相对包路径或绝对路径 options.compilerArgs.add('-Xbootclasspath/p:app/src/main/libs/WifiAp8.jar') } } } ``` ##### 编写代码
开启热点
``` if(getWifiAPState() != WIFI_AP_STATE_ENABLED){ //Android8.0及以上版本 if (Build.VERSION.SDK_INT >= 26) { mConnectivityManager.startTethering(ConnectivityManager.TETHERING_WIFI, true, new ONStartTetheringCallback()); } } ``` ![](/contentImages/image/20180920/60ZjTBoEGaNcontOwVN.png) 在AS中上述代码会有红色显示,但是不影响编译使用。可以正常编译生成apk。使用该方法不需要提前关闭wifi。 ONStartTetheringCallback类继承了OnStartTetheringCallback抽象类。 ``` class ONStartTetheringCallback extends ConnectivityManager.OnStartTetheringCallback { } ```
关闭热点
``` if(getWifiAPState() != WIFI_AP_STATE_DISABLED){ //Android8.0及以上版本 if (Build.VERSION.SDK_INT >= 26) { mConnectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI); } } ```
权限
使用上述功能需要这三个权限: ```
``` 还需要在代码中申请WRITE_SETTINGS权限,否则不能正常使用。 这样就可以了,不只是系统应用可以使用,平成的应用也可以正常使用。亲测:华为P20(Android 8.1.0)、华为mate10(Android 8.1.0)、华为V10(Android 8.0.0)、OnePlus 5T(Android8.1.0)都可以正常使用。 ------------------- #### Android 7.1开启Wifi热点 对于Android7.1、Android7.1.1、Android7.1.2的手机,开启热点的方式比较乱,有的手机用老方法 可以正常打开,比如红米5 plus(Android7.1.2)、坚果pro2(Android7.1.1),有的手机用老方法就不能正常使用(Nexus 5x 7.1.1),可以尝试用8.0的方法打开试试。 由于Android手机版本和厂家太多,手头没有太多手机,并不能做到很好的适配,所以大家可以尝试使用上述两种方法来看看哪种方法适合你手上的手机开启热点,并且热点能正常使用。 >欢迎大家**关注、评论、点赞**。 你们的支持是我坚持的动力。 ![欢迎关注我的微信公众号](/contentImages/image/jianshu/6907877-40461f37e48a4f61)
本实例支付的费用只是购买源码的费用,如有疑问欢迎在文末留言交流,如需作者在线代码指导、定制等,在作者开启付费服务后,可以点击“购买服务”进行实时联系,请知悉,谢谢
感谢
18
手机上随时阅读、收藏该文章 ?请扫下方二维码
相似例子推荐
评论
作者
zpengyong
15
例子数量
3604
帮助
125
感谢
评分详细
可运行:
4
分
代码质量:
4
分
文章描述详细:
4
分
代码注释:
4
分
综合:
4
分
作者例子
基于FFmpeg的音频编码(PCM数据编码成AAC android)
Android基于TCP的局域网聊天通信
Android 进程间通信——Service、Messenger
AsyncTask 异步任务基本使用-下载视频
Android IntentService使用
Android HandlerThread详解
Eclipse集成ijkplayer并实现本地和网络视频播放等
Android WiFi开发
Android -传统蓝牙通信聊天
Android 进程间通信——AIDL
Android -BLE蓝牙小DEMO
Android蓝牙——HID开发
Android8.0及以上系统 WiFi热点 版本适配
Android WiFi直连 双向通信
Android蓝牙A2DP连接实现