关于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)相关推荐

  1. Android studio3.0开启抓包功能打包会使apk体积增大好几倍

    Android studio3.0开启抓包功能打包会使apk体积增大好几倍 Android studio3.0开启抓包功能打包会使apk体积增大好几倍: 今天尝试了下AS3.0抓包功能,还没怎么整明白 ...

  2. Android 8.0一下热点启动

    最近需要实现热点的自动,但是各种方式之后只能实现Android 8.0以下的稳定实现: /*** 自动开启热点工具,仅对Android 8以下有效* <p>* 需要以下权限才能正常使用* ...

  3. Android之解决开启热点后跳转页面不稳定问题

    1 问题 在Android8.0版本以后,开启热点我们采用的下面这种方式,但是跳转页面后热点会断开,手机不能互相传文件了 权限说明:Android8.0需要位置权限和GPS权限,同时手机热点还不能是开 ...

  4. android+8.0关热点,体验像iPhone X,小米MIX 2升级安卓8.0了!

    原标题:体验像iPhone X,小米MIX 2升级安卓8.0了! 相对于苹果iOS手机,安卓手机的系统版本升级,总体来说比较缓慢.就当下的国内市场而言,系统版本升级至Android 8.0,或Andr ...

  5. Android 10.0 开启和关闭护眼模式

    1.概述 在10.0系统的产品定制化中,由于一些定制化开发设备中,需要护眼模式,而护眼模式功能开启和关闭 也需要提供接口供app调用,这就需要在系统api中自定义的服务中,提供开启关闭护眼模式的接口, ...

  6. android 7.0 创建热点,win7创建wifi热点脚本分享

    说明一下,此功能只适用于win7系统,并且保证电脑有无线网卡,和正确安装了驱动.还需要做的一步就是共享已连接的网络,方法可以百度. 以下文件保存成wlan.bat文件,然后运行就可以了 @echo o ...

  7. Android 8.0 WiFi Ap 热点控制接口

    1. Android 7.0 及其以前的 WiFi 热点接口 /*** Gets the Wi-Fi enabled state.** @return One of {@link #WIFI_AP_S ...

  8. 小米5android7.0,小米5正式开启Android 7.0公测 仅限开发版

    [TechWeb报道]虽然Android在后续的几个版本的市场使用率不及iOS,但是也不可否认现在的Android系统在功能完善.性能优化等方面有了长足的进步,外加上手机厂商一直以来的系统定制,让系统 ...

  9. android 6.0适应的机型,提升用户体验 可升Android 6.0机型盘点

    原标题:提升用户体验 可升Android 6.0机型盘点 [手机中国 导购]2009年Android系统正式发布,由此加速手机走向智能化进度.如今,随着Android系统日渐成熟,众多手机厂商都在此基 ...

最新文章

  1. MediaPipe:Google Research 开源的跨平台多媒体机器学习模型应用框架
  2. python3 爬虫 requests安装_爬虫开发环境部署
  3. eclipse常用以及实用的快捷键
  4. (组合数学笔记)Pólya计数理论_Part.10_Pólya定理的推广——De Bruijn定理的母函数形式
  5. 洛阳php编程培训,洛阳PHP开发培训分享提高PHP开发效率的四个编程习惯
  6. 横向越权访问java_基于ThinkPhp5开发横向越权逻辑漏洞安全指南
  7. logback介绍和配置详解
  8. Aittit rpc的实现协议 JSON-RPC XML-RPC . Ws协议webservice 目录 1. XML-RPC协议 1 1.1. JSON-RPC远程调用协议 - CieloSun
  9. android官方原生主题,原生Android可以更换系统主题吗?
  10. 广告视频投放展示平台 springboot+vue
  11. 修改IDEA代码左侧折叠线颜色
  12. CSDN-怎么设置被粉丝关注之后的自动回复
  13. 动态拨号云服务器安装Ubuntu系统使用说明
  14. 007-绘制三角函数图像(一)
  15. 沉痛悼念旷视首席科学家、旷视研究院院长孙剑博士,享年 45 岁
  16. 介绍了用Meta标签代码让360双核浏览器默认极速模式(google)打开网站不是兼容模式
  17. h5移动浏览器常见问题
  18. Caffeine使用篇 - Eviction
  19. Python——信号量、条件变量、事件
  20. springboot集成netty实现代理服务器

热门文章

  1. 保龄球-----计分程序
  2. Python logger 教程
  3. 路由模式 - direct
  4. 零点工作室暑假集训(AtCoder--ABC233)
  5. 中国电子携手IBM发力环保大数据
  6. 周末大扫除——Mac连接多蓝牙音源秒变音乐派对
  7. Ethereum Contract ABI
  8. element input限制只能输入数字
  9. 70个python练手项目,不可多得呀,建议白嫖!!!需要留邮箱哦
  10. mpaas如何实现视频播放