一、概述:最近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 热点相关推荐

  1. Unity+ET6.0网络框架的网络开发基础理论

    网络编程理论基础 文章目录 网络编程理论基础 主机间通信概述 Socket通信模型 游戏服务器架构的演变过程 用户登录逻辑详解 ET6.0框架下登录源码解释 主机间通信概述 ip地址和端口号 ​ 生活 ...

  2. xposed框架android9.0,安卓框架虚拟机VirtualXposed v0.17.1 清爽版 支持安卓9.0系统

    安卓框架虚拟机VirtualXposed v0.17.1 清爽版 支持安卓9.0系统 VirtualXposed 是基于VirtualApp 和 epic 在非ROOT环境下运行Xposed模块的实现 ...

  3. 华为Android9.0谷歌框架,华为Mate9怎样登陆谷歌商店 Mate9如何安装谷歌服务框架【详解】...

    华为Mate9作为一款专为商务人士打造的智能手机,相信很多出国的朋友都会使用谷歌地图以及其他相关的谷歌服务.但是近日根据论坛网友反映,华为Mate 9在升级到B135版本之后,移除了GMS核心框架,因 ...

  4. android9.0谷歌框架cdsk,Android Studio项目适配AndroidX(Android 9.0)的方法步骤

    说在前面: 老项目.大项目适配Android X 注意了,一定要谨慎.谨慎.再谨慎.项目中用到的第三方库多的话会很麻烦,有些第三方库还没有适配Android X. 适配Android X的两种情况:一 ...

  5. Android9.0 http网络请求失败问题分析与解决方案

    最近做的项目,在8.0版本以下都是可以正常使用,突然接收到反馈说软件在9.0无法使用,连登陆都无法登陆.而刚好我的手机也刚升级到9.0系统,就进行了测试,发现问题和查找问题,得到以下错误原因和解决方案 ...

  6. Android之通过用户名和密码连接指定wifi热点(兼容Android9.0和Android10.0和addNetwork(wifiNewConfiguration)返回-1问题)

    1 需求 通过用户名和密码连接指定wifi热点,网上的代码乱七八糟,没几个可以用,我这边整理了下,测试了华为Android9.0和小米Android9.0和10.0和OPPO Android9.0 都 ...

  7. Android 网络框架 Retrofit2.0介绍、使用和封装

    前言 时至今日,Android的网络框架不再像之前那么到处都是,随着Google把 HttpClient直接删掉,似乎意味着Android越来越成熟.网络框架中的佼佼者Volley也不再那么光鲜,取而 ...

  8. Android9.0中应用如何通过SAF框架写入外置SD卡

    背景介绍 Overview 基于SAF框架写入外置SD卡网上相关资料比较少,现整理一下具体实现方法,如果是访问主存储,弹出授权后即可正常写入,如果是副卡,在Android9.0上必须要使用SAF框架. ...

  9. Android9.0 http网络请求失败解决方法

    前言:最近在做一个OCR,调用的是百度OCR的接口,文字识别出来之后想加一个翻译的功能,还是使用的百度翻译.(不管外界如何唱衰百度,个人感觉百度这方面做的还是可以的).由于之前请求网络用的okhttp ...

最新文章

  1. java treeset 重复,关于 TreeSet 为什么我这样写,还有是有重复的记录啊啊啊啊
  2. 泛型Generics
  3. mysql pmm进程_mysql性能监控软件pmm
  4. (转)大型网站架构演化发展历程
  5. BZOJ 4826 【HNOI2017】 影魔
  6. Windows 10 Visual Studio 2015 配置 Caffe
  7. 在dos下的文件及文件夹操作命令
  8. 笨方法学python - 03
  9. 阿里巴巴P3C java编程规范(最新版github下载)
  10. Typora更换炫酷主题(含主题下载云盘链接)
  11. C# NPOI Excel 合并单元格和取消单元格
  12. linux中rm件命令,Linux rm命令详解
  13. 客户端到服务器端的通信过程及原理
  14. gitter 卸载_最佳Gitter渠道:硬件,物联网和机器人技术
  15. 【C语言】变量被重复定义
  16. 阿里云ECS服务器内存一直居高不下,被挂木马解决方法
  17. 旧 Mac、PC 别扔,变身 Chromebook 了解一下
  18. 关于json数组转List对象的问题
  19. [H265/HEVC] 波前并行处理WPP
  20. 阿里巴巴何以超越周期?| 一点财经

热门文章

  1. 《信息系统行锁等待的成因分析及智能化解决方案》
  2. 银行客户违约信息分析(数据挖掘)
  3. 因果故事:偷不走的命运!
  4. Linux中JAVA服务器CPU占用过高(分析解决方法)
  5. 在vscode中使用latex高效书写论文教程
  6. github上比较好用的第三方
  7. ArcGIS点集之间两两连线
  8. linux强制退出进程
  9. 失败魔咒下的企业海外并购(ZT)
  10. 基于SSM的校园兼职管理系统