关于Android 8.0开启热点(HotSpot)
关于Android 8.0开启热点(HotSpot)
- 开启热点(Android 8.0)
- 关闭热点(Android 8.0)
- 第一种方法:
- 第二种方法:
- 注意事项:
- 问题1:
- 解决:
- 问题2:
- 解决:
- 致谢
最近写了一个局域网文件传输的小app,涉及到开关wifi的有关知识,在这里分享一下关于Android8.0热点管理的一些小知识点!!相信看到这篇文章的应该都能很好地解决Android8.0以前版本的热点管理,这里就不一一讲述了,下面进入关键。
开启热点(Android 8.0)
/** 适配于Android_O上创建HotSpot的方法
*/
public void setWifiApEnabledForAndroidO(){WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);wifiManager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback() {/**这里是成功开启wifi后回调的方法,此处的reservation中可以通过.getWifiConfiguration().获取*到WifiConfiguration,同样的,在WifiConfiguration中可以获取到开启热点的SSID和preSharedKey,*此方法开启的热点的名称和密码是系统随机生产的,无法自定义名称和密码,至少我到目前为止没有找到可用于设置8.0名称和密码的方法哈哈哈。*/@Overridepublic void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) {super.onStarted(reservation);String SSID = reservation.getWifiConfiguration().SSID;String preSharedKey = reservation.getWifiConfiguration().preSharedKey;}@Overridepublic void onStopped() {super.onStopped();}@Overridepublic void onFailed(int reason) {super.onFailed(reason);}}, null);}
关闭热点(Android 8.0)
第一种方法:
保存开启热点方法中的回调参数reservation,可以通过reservation.close();关闭上述所开启的热点,不过个人觉得如果要关闭用户本身的自己开的热点的话,此方法应该不可行,不过第二种方法亲测可以关闭用户自己本身开启的热点。???
第二种方法:
/** 适配于Android_O上关闭HotSpot的方法
*/
public void closeHotSpotForAndroid_O(){ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);Field iConnMgrField;try {iConnMgrField = connManager.getClass().getDeclaredField("mService");iConnMgrField.setAccessible(true);Object iConnMgr = iConnMgrField.get(connManager);Class<?> iConnMgrClass = Class.forName(iConnMgr.getClass().getName());Method stopTethering = iConnMgrClass.getMethod("stopTethering", int.class);stopTethering.invoke(iConnMgr, 0);} catch (Exception e) {e.printStackTrace();}}
到目前为止,上述的开启和关闭热点应该可以实现了,不过我发现有一些问题还是需要解决的。
注意事项:
问题1:
- 当开启热点后,应用进入后台运行状态,大约6s之前所开启的热点就会自动关闭。
解决:
- 将开启和关闭热点的方法放置在远程服务中开启,另其在单独线程中开启,可以解决问题1,如下:
(以Android Studio工具为例子创建远程服务)
1.在如下图工作文件夹中找到与"java"文件夹同级任意文件夹,右键–>New–>AIDL–>AILD File后输入名字Finish,会自动生产aidl文件夹和所创建的aidl文件。
2.随后在创建的AIDL文件中声明开启关闭的方法。
// IMyAidlInterface.aidl
package com.example.zzzzzzzzzzzzzzz.networktransmission;
// Declare any non-default types here with import statements
interface IMyAidlInterface {/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/void setWifiApEnabledForAndroidO();void closeHotSpotForAndroid_O();
}
3.Clean或ReBuild项目,随后创建一个继承于Service的类,在其中编写远程服务中的本地Binder。
@RequiresApi(api = Build.VERSION_CODES.O)private final IMyAidlInterface.Stub mBuilder = new IMyAidlInterface.Stub() {@Overridepublic void setWifiApEnabledForAndroidO(){//开启热点的方法代码段}@Overridepublic void closeHotSpotForAndroid_O(){//关闭热点的方法代码段};
4.在创建继承于Service的类中,重写onBind()方法,返回builder对象。
@Overridepublic IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.System.out.println("onBind service");if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {return mBuilder;}else{return null;}}
5.在AndroidManifest.xml配置文件中注册该远程服务。
<serviceandroid:name=".service.AndroidOApServer"android:process=":ap"><intent-filter><action android:name=".service.AIDL_SERVICE"/></intent-filter></service>
这里的android:process很关键,关系到其是否是单独进程运行
android:process:是否需要在单独的进程中运行,当设置为android:process=”:remote”时,代表Service在单独的进程中运行。注意“:”很重要,它的意思是指要在当前进程名称前面附加上当前的包名,所以“remote”和”:remote”不是同一个意思,前者的进程名称为:remote,而后者的进程名称为:App-packageName:remote。
6.在要开启wifi的activity中声明定义ServiceConnection和编写初始化Service方法。
- 声明定义ServiceConnection和AIDL
private IMyAidlInterface apService;
private ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {apService = IMyAidlInterface.Stub.asInterface(service);}@Overridepublic void onServiceDisconnected(ComponentName name) {apService = null;}};
- 绑定服务
private void initApService(){Intent intent = new Intent();intent.setAction(".service.AIDL_SERVICE");bindService(new Intent(MainActivity.getExplicitIntent(SendActivity.this,intent)),serviceConnection, Service.BIND_AUTO_CREATE);}
- 调用远程服务中开启/关闭热点方法
apService.setWifiApEnabledForAndroidO();//开启
apService.closeHotSpotForAndroid_O();//关闭
到这里为止,远程服务基本上可以正常开启了,但是Android 8.0对后台服务有限制,这里又需要用到前台服务的相关知识了,即转为前台服务保活,具体前台服务参考这里,转为前台服务后,基于Android 8.0 的app开启热点后切换到后台也不会出现6s热点断开的情况了
问题2:
开启热点后,所产生的SSID和preSharedKey如何传回UI线程。
解决:
通过BoradCastReciver机制,把要传的数据放入Intent中传送即可。
致谢
感谢广大csdn博主们发表的有关android8.0热点文章!关于这方面有不懂的问题可以在评论区留言,如果我有看到也第一时间回复你哈!
启发我过河的文章(感谢感谢!!):
https://blog.csdn.net/qq_35986042/article/details/83658581
关于Android 8.0开启热点(HotSpot)相关推荐
- Android studio3.0开启抓包功能打包会使apk体积增大好几倍
Android studio3.0开启抓包功能打包会使apk体积增大好几倍 Android studio3.0开启抓包功能打包会使apk体积增大好几倍: 今天尝试了下AS3.0抓包功能,还没怎么整明白 ...
- Android 8.0一下热点启动
最近需要实现热点的自动,但是各种方式之后只能实现Android 8.0以下的稳定实现: /*** 自动开启热点工具,仅对Android 8以下有效* <p>* 需要以下权限才能正常使用* ...
- Android之解决开启热点后跳转页面不稳定问题
1 问题 在Android8.0版本以后,开启热点我们采用的下面这种方式,但是跳转页面后热点会断开,手机不能互相传文件了 权限说明:Android8.0需要位置权限和GPS权限,同时手机热点还不能是开 ...
- android+8.0关热点,体验像iPhone X,小米MIX 2升级安卓8.0了!
原标题:体验像iPhone X,小米MIX 2升级安卓8.0了! 相对于苹果iOS手机,安卓手机的系统版本升级,总体来说比较缓慢.就当下的国内市场而言,系统版本升级至Android 8.0,或Andr ...
- Android 10.0 开启和关闭护眼模式
1.概述 在10.0系统的产品定制化中,由于一些定制化开发设备中,需要护眼模式,而护眼模式功能开启和关闭 也需要提供接口供app调用,这就需要在系统api中自定义的服务中,提供开启关闭护眼模式的接口, ...
- android 7.0 创建热点,win7创建wifi热点脚本分享
说明一下,此功能只适用于win7系统,并且保证电脑有无线网卡,和正确安装了驱动.还需要做的一步就是共享已连接的网络,方法可以百度. 以下文件保存成wlan.bat文件,然后运行就可以了 @echo o ...
- Android 8.0 WiFi Ap 热点控制接口
1. Android 7.0 及其以前的 WiFi 热点接口 /*** Gets the Wi-Fi enabled state.** @return One of {@link #WIFI_AP_S ...
- 小米5android7.0,小米5正式开启Android 7.0公测 仅限开发版
[TechWeb报道]虽然Android在后续的几个版本的市场使用率不及iOS,但是也不可否认现在的Android系统在功能完善.性能优化等方面有了长足的进步,外加上手机厂商一直以来的系统定制,让系统 ...
- android 6.0适应的机型,提升用户体验 可升Android 6.0机型盘点
原标题:提升用户体验 可升Android 6.0机型盘点 [手机中国 导购]2009年Android系统正式发布,由此加速手机走向智能化进度.如今,随着Android系统日渐成熟,众多手机厂商都在此基 ...
最新文章
- MediaPipe:Google Research 开源的跨平台多媒体机器学习模型应用框架
- python3 爬虫 requests安装_爬虫开发环境部署
- eclipse常用以及实用的快捷键
- (组合数学笔记)Pólya计数理论_Part.10_Pólya定理的推广——De Bruijn定理的母函数形式
- 洛阳php编程培训,洛阳PHP开发培训分享提高PHP开发效率的四个编程习惯
- 横向越权访问java_基于ThinkPhp5开发横向越权逻辑漏洞安全指南
- logback介绍和配置详解
- Aittit rpc的实现协议 JSON-RPC XML-RPC . Ws协议webservice 目录 1. XML-RPC协议	1 1.1. JSON-RPC远程调用协议 - CieloSun
- android官方原生主题,原生Android可以更换系统主题吗?
- 广告视频投放展示平台 springboot+vue
- 修改IDEA代码左侧折叠线颜色
- CSDN-怎么设置被粉丝关注之后的自动回复
- 动态拨号云服务器安装Ubuntu系统使用说明
- 007-绘制三角函数图像(一)
- 沉痛悼念旷视首席科学家、旷视研究院院长孙剑博士,享年 45 岁
- 介绍了用Meta标签代码让360双核浏览器默认极速模式(google)打开网站不是兼容模式
- h5移动浏览器常见问题
- Caffeine使用篇 - Eviction
- Python——信号量、条件变量、事件
- springboot集成netty实现代理服务器