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

一、准备工作

开发环境:

 jdk1.8

 AS(3.0.1)

运行环境:

 华为V10(Android8.0)、华为p20(Android8.1)、华为mate10(Android8.0)

实现功能:

  Wifi热点的开启关闭。

二、代码结构

三、代码详解

Android 7.0及以前Wifi热点

Android 7.1、8.0Wifi热点

看之前评论发现Android7.1以上的手机开启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 7.1 开启Wifi热点

对于Android7.1、8.0的设备,通过WifiManager setWifiApEnabled,可以打开Wifi热点,但是会发现此热点,连接不上(由于DHCP没有开启),所以不会分配ip地址,也就导致不能正常使用。

在Android7.1系统应用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){
//Android7.1及以上版本
if (Build.VERSION.SDK_INT >= 25) {
mConnectivityManager.startTethering(ConnectivityManager.TETHERING_WIFI,
true, new ONStartTetheringCallback());
}
}



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

ONStartTetheringCallback类继承了OnStartTetheringCallback抽象类。

class ONStartTetheringCallback extends
ConnectivityManager.OnStartTetheringCallback {
}

关闭热点

if(getWifiAPState() != WIFI_AP_STATE_DISABLED){
//Android7.1及以上版本
if (Build.VERSION.SDK_INT >= 25) {
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、华为mate10、华为V10都可以正常使用)。

欢迎大家关注、评论、点赞

你们的支持是我坚持的动力。

Android WiFi热点7.1以上版本适配

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

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

Android WiFi热点7.1以上版本适配的更多相关文章

  1. Android WiFi热点完全研究(自定义创建、跳转系统界面设置、读取配置、切换,Android6.0适配)

    前言: WiFi热点设置页面的安全性选项在Android 4.x上有“无”.“WPA PSK”.“WPA2 PSK”三个选项,在Android 5.0(含)之后去掉了WPA PSK选项(部分手机厂家会 ...

  2. android wifi热点 socket通信

    1.首先建立wifi热点服务器  wifi客户端连接 2.开启一个子线程循环监听某个端口,进行数据流输入输出 /* 服务器 接收数据 */ class Receiver extends Thread ...

  3. android wifi 热点、socket通讯

    WiFi管理工具类 package com.wyf.app.common; import java.lang.reflect.InvocationTargetException; import jav ...

  4. Android 屏幕,语言,API版本 适配和兼容性

    Supporting Different Languages http://developer.android.com/training/basics/supporting-devices/langu ...

  5. Android 开发 创建WiFi、WiFi热点 ---开发集合

    WIFI 权限 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> < ...

  6. android源码中修改wifi热点默认始终开启

    在项目\frameworks\base\wifi\java\android\net\wifi\WifiStateMachine.java里面,有如下的代码,是设置wifi热点保持状态的:如下: pri ...

  7. Android抓包方法(三)之Win7笔记本Wifi热点+WireShark工具

    Android抓包方法(三) 之Win7笔记本Wifi热点+WireShark工具 前言 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等 ...

  8. android 开发自建wifi热点的默认ip

    android 开发自建wifi热点的默认ip是:192.168.43.1  (小米3测试)

  9. android 代码设置、打开wifi热点及热点的连接

    用过快牙的朋友应该知道它们在两天设备之间传输文件的时候使用的是wifi热点,然后另一台便连接这个热点再进行传输.快牙传输速度惊人应该跟它的这种机制有关系吧.不知道它的搜索机制是怎样的,但我想应该可以通 ...

随机推荐

  1. 50.分治算法练习:  二分算法:  2703 奶牛代理商 XII

    时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 小徐从美国回来后,成为了USACO中国区的奶牛销售代理商,专门出售 ...

  2. python开发_IDEL(Python GUI)的使用方法

    在这篇blog"Python开发_python的安装"里面你会了解到python的安装. 安装后,我们希望能够运用python GUI来运行一些我们编写的程序,那么Python G ...

  3. HDU 5656 CA Loves GCD dp

    CA Loves GCD 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5656 Description CA is a fine comrade w ...

  4. Codeforces Round #346 (Div. 2) E. New Reform dfs

    E. New Reform 题目连接: http://www.codeforces.com/contest/659/problem/E Description Berland has n cities ...

  5. HDU 5296 Annoying problem dfs序 lca

    Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5296 Description Coco has a tree, w ...

  6. 稀疏编码直方图----一种超越HOG的轮廓特征

    该论文是一篇来自CMU 的CVPR2013文章,提出了一种基于稀疏编码的轮廓特征,简称HSC(Histogram of Sparse Code),并在目标检测中全面超越了HOG(Histogram o ...

  7. 也谈时间管理和GTD

    也谈时间管理和GTD 时间管理 随着事情越来约多发现时间越来越不够用了,但是其实每天时间都是恒定的,并不增也不减,所以感觉时间不够用了总归只是个人主观感觉. 对我个人帮助比较大的是三本书<番茄时 ...

  8. 关于arcgi s_api_for_flex的总结

    1.flex 的简介 a) Flex是adobe开发的东西,主要特点就是开发一个swf格式的应用,flex可以做桌面的应用和web的应用,但本质差不多. b) Flex采用mxml的格式来进行应用的布 ...

  9. IOS上传图片方法类

    IOS上传图片方法类   iPhone开发中遇到上传图片问题,找到多资料,最终封装了一个类,请大家指点,代码如下 // // RequestPostUploadHelper.h // demodes ...

  10. objective C中的字符串NSStirng常用操作

    objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...