Android9.0 网络框架之--Tethering 热点
一、概述:最近Android P 平台遇到一个打开车机热点,手机连接后不能上网的 问题,下面是正常的log和异常的log
热点正常能上网的log:
热点异常不能上网的log:
通过log发现Tethering: Found upstream interface(s): null 所以出现不能上网的情况,这里也分析一下打开热点,连接上网的过程。
参考博客:
https://blog.csdn.net/weixin_42093428/article/details/84062557
二、打开热点的流程
调用ConnectivityManager 的 startTethering方法
public void startTethering(int type, boolean showProvisioningUi,
final OnStartTetheringCallback callback, Handler handler) {
Preconditions.checkNotNull(callback, “OnStartTetheringCallback cannot be null.”);
ResultReceiver wrappedCallback = new ResultReceiver(handler) {@Overrideprotected void onReceiveResult(int resultCode, Bundle resultData) {if (resultCode == TETHER_ERROR_NO_ERROR) {callback.onTetheringStarted();} else {callback.onTetheringFailed();}}};try {String pkgName = mContext.getOpPackageName();Log.i(TAG, "startTethering caller:" + pkgName);mService.startTethering(type, wrappedCallback, showProvisioningUi, pkgName);} catch (RemoteException e) {Log.e(TAG, "Exception trying to start tethering.", e);wrappedCallback.send(TETHER_ERROR_SERVICE_UNAVAIL, null);}
}
这里 mService.startTethering,mService 实际上就是ConnectivityService ,我们看看ConnectivityService 的startTethering 方法
@Override
public void startTethering(int type, ResultReceiver receiver, boolean showProvisioningUi,
String callerPkg) {
ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg);
if (!isTetheringSupported()) {
receiver.send(ConnectivityManager.TETHER_ERROR_UNSUPPORTED, null);
return;
}
mTethering.startTethering(type, receiver, showProvisioningUi);
}
如果系统支持热点功能,就会调用Tethering 的 startTethering 方法
代码路径:frameworks/base/services/core/java/com/android/server/connectivity/Tethering.java
public void startTethering(int type, ResultReceiver receiver, boolean showProvisioningUi) {if (!isTetherProvisioningRequired()) {enableTetheringInternal(type, true, receiver);return;}if (showProvisioningUi) {runUiTetherProvisioningAndEnable(type, receiver);} else {runSilentTetherProvisioningAndEnable(type, receiver);}
}
这里传入的showProvisioningUi 为false ,接着走 runSilentTetherProvisioningAndEnable(type, receiver);
private void runSilentTetherProvisioningAndEnable(int type, ResultReceiver receiver) {ResultReceiver proxyReceiver = getProxyReceiver(type, receiver);sendSilentTetherProvisionIntent(type, proxyReceiver);
}private void sendSilentTetherProvisionIntent(int type, ResultReceiver receiver) {Intent intent = new Intent();intent.putExtra(EXTRA_ADD_TETHER_TYPE, type);intent.putExtra(EXTRA_RUN_PROVISION, true);intent.putExtra(EXTRA_PROVISION_CALLBACK, receiver);intent.setComponent(TETHER_SERVICE);final long ident = Binder.clearCallingIdentity();try {mContext.startServiceAsUser(intent, UserHandle.CURRENT);} finally {Binder.restoreCallingIdentity(ident);}
}
这里面会启动一个TETHER_SERVICE,他的包名类名是com.android.settings/.wifi.tether.TetherService ,原来走了一圈最后还是走到了Settings 的代码中了。
TetherService 中最后会发送一个广播
private void startProvisioning(int index) {
if (index < mCurrentTethers.size()) {
Intent intent = getProvisionBroadcastIntent(index);
setEntitlementAppActive(index);
if (DEBUG) Log.d(TAG, "Sending provisioning broadcast: " + intent.getAction()+ " type: " + mCurrentTethers.get(index));sendBroadcast(intent);mInProvisionCheck = true;}
}private Intent getProvisionBroadcastIntent(int index) {String provisionAction = getResources().getString(com.android.internal.R.string.config_mobile_hotspot_provision_app_no_ui);Intent intent = new Intent(provisionAction);int type = mCurrentTethers.get(index);intent.putExtra(TETHER_CHOICE, type);intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND| Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);return intent;
}
Android9.0 网络框架之--Tethering 热点相关推荐
- Unity+ET6.0网络框架的网络开发基础理论
网络编程理论基础 文章目录 网络编程理论基础 主机间通信概述 Socket通信模型 游戏服务器架构的演变过程 用户登录逻辑详解 ET6.0框架下登录源码解释 主机间通信概述 ip地址和端口号 生活 ...
- xposed框架android9.0,安卓框架虚拟机VirtualXposed v0.17.1 清爽版 支持安卓9.0系统
安卓框架虚拟机VirtualXposed v0.17.1 清爽版 支持安卓9.0系统 VirtualXposed 是基于VirtualApp 和 epic 在非ROOT环境下运行Xposed模块的实现 ...
- 华为Android9.0谷歌框架,华为Mate9怎样登陆谷歌商店 Mate9如何安装谷歌服务框架【详解】...
华为Mate9作为一款专为商务人士打造的智能手机,相信很多出国的朋友都会使用谷歌地图以及其他相关的谷歌服务.但是近日根据论坛网友反映,华为Mate 9在升级到B135版本之后,移除了GMS核心框架,因 ...
- android9.0谷歌框架cdsk,Android Studio项目适配AndroidX(Android 9.0)的方法步骤
说在前面: 老项目.大项目适配Android X 注意了,一定要谨慎.谨慎.再谨慎.项目中用到的第三方库多的话会很麻烦,有些第三方库还没有适配Android X. 适配Android X的两种情况:一 ...
- Android9.0 http网络请求失败问题分析与解决方案
最近做的项目,在8.0版本以下都是可以正常使用,突然接收到反馈说软件在9.0无法使用,连登陆都无法登陆.而刚好我的手机也刚升级到9.0系统,就进行了测试,发现问题和查找问题,得到以下错误原因和解决方案 ...
- Android之通过用户名和密码连接指定wifi热点(兼容Android9.0和Android10.0和addNetwork(wifiNewConfiguration)返回-1问题)
1 需求 通过用户名和密码连接指定wifi热点,网上的代码乱七八糟,没几个可以用,我这边整理了下,测试了华为Android9.0和小米Android9.0和10.0和OPPO Android9.0 都 ...
- Android 网络框架 Retrofit2.0介绍、使用和封装
前言 时至今日,Android的网络框架不再像之前那么到处都是,随着Google把 HttpClient直接删掉,似乎意味着Android越来越成熟.网络框架中的佼佼者Volley也不再那么光鲜,取而 ...
- Android9.0中应用如何通过SAF框架写入外置SD卡
背景介绍 Overview 基于SAF框架写入外置SD卡网上相关资料比较少,现整理一下具体实现方法,如果是访问主存储,弹出授权后即可正常写入,如果是副卡,在Android9.0上必须要使用SAF框架. ...
- Android9.0 http网络请求失败解决方法
前言:最近在做一个OCR,调用的是百度OCR的接口,文字识别出来之后想加一个翻译的功能,还是使用的百度翻译.(不管外界如何唱衰百度,个人感觉百度这方面做的还是可以的).由于之前请求网络用的okhttp ...
最新文章
- java treeset 重复,关于 TreeSet 为什么我这样写,还有是有重复的记录啊啊啊啊
- 泛型Generics
- mysql pmm进程_mysql性能监控软件pmm
- (转)大型网站架构演化发展历程
- BZOJ 4826 【HNOI2017】 影魔
- Windows 10 Visual Studio 2015 配置 Caffe
- 在dos下的文件及文件夹操作命令
- 笨方法学python - 03
- 阿里巴巴P3C java编程规范(最新版github下载)
- Typora更换炫酷主题(含主题下载云盘链接)
- C# NPOI Excel 合并单元格和取消单元格
- linux中rm件命令,Linux rm命令详解
- 客户端到服务器端的通信过程及原理
- gitter 卸载_最佳Gitter渠道:硬件,物联网和机器人技术
- 【C语言】变量被重复定义
- 阿里云ECS服务器内存一直居高不下,被挂木马解决方法
- 旧 Mac、PC 别扔,变身 Chromebook 了解一下
- 关于json数组转List对象的问题
- [H265/HEVC] 波前并行处理WPP
- 阿里巴巴何以超越周期?| 一点财经