代码地址如下:
http://www.demodashi.com/demo/13907.html

###一、准备工作
开发环境:
 jdk1.8
 AS(3.0.1)
运行环境:
 华为V10(Android8.0)、华为p20(Android8.1)、华为mate10(Android8.1.0)、OnePlus 5T(Android8.1.0)

实现功能:
  Wifi热点的开启关闭。

二、代码结构

三、代码详解

Android 7.0及以前Wifi热点
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的方法


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包拷贝到工程中,如下所示:

该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());}
}


在AS中上述代码会有红色显示,但是不影响编译使用。可以正常编译生成apk。使用该方法不需要提前关闭wifi。

ONStartTetheringCallback类继承了OnStartTetheringCallback抽象类。

class ONStartTetheringCallback extendsConnectivityManager.OnStartTetheringCallback {
}

关闭热点

if(getWifiAPState() != WIFI_AP_STATE_DISABLED){//Android8.0及以上版本if (Build.VERSION.SDK_INT >= 26) {mConnectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI);}
}

权限
使用上述功能需要这三个权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />

还需要在代码中申请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手机版本和厂家太多,手头没有太多手机,并不能做到很好的适配,所以大家可以尝试使用上述两种方法来看看哪种方法适合你手上的手机开启热点,并且热点能正常使用。

欢迎大家关注、评论、点赞
你们的支持是我坚持的动力。
Android8.0及以上系统 WiFi热点 版本适配

代码地址如下:
http://www.demodashi.com/demo/13907.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

Android8.0及以上系统 WiFi热点 版本适配相关推荐

  1. Android 8.0学习(18)--- Android8.0运行时权限策略变化和适配方案

    Android8.0运行时权限策略变化和适配方案    在 Android O 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用.对 ...

  2. Android8.0运行时权限策略变化和适配方案

    版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com Android8.0也就是Android O即将要发布了,有很多新特性,目前我们可以通过Android ...

  3. Android7.0以上多系统语言的国际化适配

    前言 近期偶然发现一个问题,我们的应用在7.0以上的个别机型上,会遇到国际化不对的问题,现象是:手机明明设置了中文,应用却可能显示成英文. 问题分析 问题机型:三星s8 plus 系统版本:Andro ...

  4. Win10系统wifi热点经常自动关闭怎么办

    如果是在QQ视频聊天过程中出现这种状况,可以优先考虑: 1.软件开的太多,导致运行卡顿.关闭无用的软件 2.换用微信视频聊天,因为QQ聊天占用cpu较大,而微信聊天占用cpu和内存较小 3.考虑将软件 ...

  5. 华为android贡献度,Android8.0系统占比大幅提升,华为、荣耀、小米成为主要贡献...

    原标题:Android8.0系统占比大幅提升,华为.荣耀.小米成为主要贡献 安卓推出Android8.0系统至今已半年有余,如今Android8.1稳定版.Android9.0开发者预览版也发布了,但 ...

  6. android5.0 广播失效,解决Android 8.0及以上系统接收不到广播的问题

    最近把自己的手机系统升级到了android 8.0,然后以前能正常运行的项目,莫名其妙的出了问题,有个地方广播接收不到了,然后分别在6.0和7.0的设备上运行了项目,发现一切正常,擦,估计是高版本系统 ...

  7. win7如何设置wifi热点_win7设置wifi热点的方法

    经常有用户问小编怎么使用电脑设置热点,其实用电脑设置热点的操作方法有很多种,操作也都还比较简单,接下来小编就以win7系统为例来说说笔记本设置热点的操作步骤. 现在一般家庭都拥有电脑,笔记本,手机等不 ...

  8. 华为鸿蒙os手机系统下载,华为鸿蒙2.0还原EMUI11系统

    华为已经开启了HarmonyOS 2.0 Beta公测阶段,拥有公测资格的华为手机用户可以升级,体验这款全场景分布式操作系统.如果您觉得用起来不习惯,可以借助本页提供的华为鸿蒙2.0还原EMUI11系 ...

  9. Android rom开发:固定设置wifi热点的ip、ssid及密码

    Android9.0起,开启wifi热点的逻辑进行了调整,ip ssid 密码均为随机生成,为便于通过wifi热点进行无线通信传输,特将固定设置wifi热点的ip.ssid及密码的方法总结如下: mo ...

最新文章

  1. uber_这就是我本可以免费骑Uber的方式
  2. 关于Android制作.9.png图片
  3. 使用netty编写IM通信界面
  4. linux 上配置swoole
  5. 计算属性|| 计算属性与方法的区别:计算属性是基于它们的依赖进行缓存的 ;方法不存在缓存||侦听器
  6. 兰华峰:商业模式驱动企业参与MSU评测
  7. 大连交通大学计算机网络,计算机网络题库(大连交通大学)chapter5.doc
  8. [react] 和Component两者的区别是什么
  9. [react] 在React中组件的props改变时更新组件的有哪些方法?
  10. 【英语学习】【WOTD】litmus test 释义/词源/示例
  11. Apeaksoft iOS Toolkit for Mac数据恢复软件
  12. 2017年一线城市程序员工资大调查
  13. Groovy~Groovy运算符
  14. 【爬虫】如何通过爬虫,爬取百度图片?新手小白一看便会,内附超详细代码讲解
  15. 域名被劫持了怎么处理
  16. layui表格使用及分页实现
  17. 软件开发工程师进阶之路(一)
  18. 2010中13寸MacbookPro光驱位安装SSD记录
  19. linux两个文件取交集、并集、差集
  20. 基于Hadoop开发的大数据实战项目——电商日志分享系统

热门文章

  1. efcore 有值才加where_lol手游怎么加好友 日服英雄联盟手游邀请好友一起玩方法[多图]...
  2. 2.c++模式设计-工厂模式
  3. 《你还在我身旁》 香港中文大学《独立时代》杂志社微情书征文大赛一等奖作品。作者为香港中文大学学生戴畅。
  4. 6410的系统时钟设置(中)---相关寄存器介绍
  5. 【LeetCode】【HOT】102. 二叉树的层序遍历(队列)
  6. 【LeetCode】【HOT】84. 柱状图中最大的矩形(栈)
  7. 人人都可以写的可视化Python小程序第二篇:旋转的烟花
  8. 在死循环中使用Scanner获得键盘输入
  9. POJ 6048 泰国佛塔 【dfs搜索】【暴力大比拼】【北大ACM/ICPC竞赛训练】
  10. 洛谷P4092树——并查集