Android usb网络共享详解

Android usb网络共享详解

文章目录

  • Android usb网络共享详解
    • 一、前言
    • 二、USB网络共享使用的前提
      • 1、Android设备支持adb 并且打开usb开关
      • 2、原生Settings能看到USB网络共享开关
      • 3、代码中检测USB网络共享是否支持
    • 三、Settings 中USB网络共享代码的部分代码
      • 1、Settings\res\xml\tether_prefs.xml
      • 2、TetherSettings.java
    • 四、Android USB 网络共享相关类
      • 1、USB网络共享核心组件
      • 2、开启USB网络共享的代码
      • 3、 **网络接口**节点
      • 4、USB网络共享开启成功后的ifconfig显示
      • 5、调试与故障排除
        • (1)查看网络接口
        • (2) **检查网络共享状态**
        • (3)日志分析
      • 4、手动启用(Root 设备)
    • 三、其他
      • 1、USB网络共享小结
      • 2、Android14 以太网共享功能 相关代码简介
  • ps: 现在走的每一步,都在为未来积蓄力量,别停下,向前跑,光芒终会与你相遇!

一、前言

Android USB网络共享? 很多人可能都没用过或者开发过。

下面简单介绍一下,以后可能用到呢。

Android USB 网络共享(USB Tethering):允许设备通过 USB 连接将移动网络或 Wi-Fi 网络共享给其他设备(如电脑)使用。

这一功能涉及底层网络协议、USB 通信和系统服务等多个层面。

简单的说:

USB网络共享功能就是Android设备连接电脑后打开网络共享开关,能让电脑使用Android设备的网络。

本文只是介绍一下基础面的知识,对于系统相关适配代码不做深入研究。

很多系统默认是支持这个功能USB网络共享功能的,但是也有些系统不显示这个共享功能,

或者显示这个功能但是无法点击开启,这是为啥呢?

二、USB网络共享使用的前提

1、Android设备支持adb 并且打开usb开关

笔记本连接adb 后能看到 adb devices 设备。

2、原生Settings能看到USB网络共享开关

路径:设置 → 网络和互联网 → 热点和网络共享 → USB 网络共享
若选项存在且可启用,则设备支持.

3、代码中检测USB网络共享是否支持

ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);// 检查是否支持 USB 网络共享
boolean isSupported = connManager.isTetheringSupported();// 获取可用的 USB 网络共享接口
List<String> availableUsbRegexs = connManager.getTetherableUsbRegexs();

所以显示USB网络开关,但是无法打开USB网络开关的情况,一般是应用判断USB网络共享不支持的情况;

有可能是系统USB未开启或者未连接电脑adb的情况或者其他异常情况。

如果显示原生Settings中不显示USB网络共享开关咋搞?

这种情况估计要分享一下Settings 代码中,USB 网络共享开关显示控制代码了。

三、Settings 中USB网络共享代码的部分代码

1、Settings\res\xml\tether_prefs.xml

USB网络共享的xml布局文件代码

 <com.android.settingslib.PrimarySwitchPreferenceandroid:key="wifi_tether" // 热点共享android:title="@string/wifi_hotspot_checkbox_text"android:summary="@string/wifi_hotspot_off_subtext"android:fragment="com.android.settings.wifi.tether.WifiTetherSettings"settings:allowDividerAbove="true"settings:maxLines="2"/><com.android.settingslib.RestrictedSwitchPreferenceandroid:key="usb_tether_settings" //-----》usb网络共享android:title="@string/usb_tethering_button_text"android:summary="@string/usb_tethering_subtext"settings:keywords="@string/keywords_hotspot_tethering" /><SwitchPreferenceandroid:key="enable_bluetooth_tethering" //蓝牙网络共享android:title="@string/bluetooth_tether_checkbox_text"android:summary="@string/bluetooth_tethering_subtext"settings:keywords="@string/keywords_hotspot_tethering" />

2、TetherSettings.java

布局控制的具体代码:

Settings\src\com\android\settings\network\tether\TetherSettings.java

public class TetherSettings extends RestrictedSettingsFragment {static final String KEY_USB_TETHER_SETTINGS = "usb_tether_settings";RestrictedSwitchPreference mUsbTether; //usb网络共享TetheringManager mTm;//网络共享的管理者@VisibleForTestingvoid setupTetherPreference() {mUsbTether = (RestrictedSwitchPreference)findPreference(KEY_USB_TETHER_SETTINGS);}@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);...mUsbRegexs = mTm.getTetherableUsbRegexs();final boolean usbAvailable = mUsbRegexs.length != 0;if (!usbAvailable || Utils.isMonkeyRunning()) {getPreferenceScreen().removePreference(mUsbTether); //这里会移除USB网络共享选项}//普通应用也能查,一般为 false//Utils.isMonkeyRunning() --> ActivityManager.isUserAMonkey();}...
}

判断系统是否支持usb网络分享:

   public boolean isCanUsbShare() {TetheringManager tetheringManager = (TetheringManager) context.getSystemService(Context.TETHERING_SERVICE);String[] listTetherableUsbRegexs =  tetheringManager.getTetherableUsbRegexs();LogUtil.debugInform("listTetherableUsbRegexs = " + listTetherableUsbRegexs.length);ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);LogUtil.debugInform("isUserAMonkey() = " + activityManager.isUserAMonkey());if (listTetherableUsbRegexs.length <= 0 || activityManager.isUserAMonkey()) {return false}return true;}

上面可以看到如果系统可用的USB网络节点小于等于0就会不显示USB网络共享开关;

可以直接把 removePreference(mUsbTether) 的地方注释,就会一直显示 USB网络共享开关;

但是能不能打开又是需要具体情况具体分析了。

四、Android USB 网络共享相关类

1、USB网络共享核心组件

UsbManager:管理 USB 设备连接
TetheringManager:控制网络共享功能
Clatd:6to4 转换守护进程(处理 IPv6/IPv4 转换)
DnsProxy:DNS 代理服务
netd:网络守护进程,管理网络接口和路由

2、开启USB网络共享的代码

// 需要 android.permission.MODIFY_NETWORK_SETTINGS 权限public void enableUsbTethering(Context context) {ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);// 检查是否支持 USB 网络共享if (connManager.isTetheringSupported()) {try {// 获取可用的网络共享接口List<String> available = connManager.getTetherableUsbRegexs();if (!available.isEmpty()) {// 启用 USB 网络共享connManager.startTethering(ConnectivityManager.TETHERING_USB,true, // 持久化设置new ConnectivityManager.OnStartTetheringCallback() {@Overridepublic void onTetheringStarted() {Log.d("Tethering", "USB 网络共享已启动");}@Overridepublic void onTetheringFailed() {Log.e("Tethering", "USB 网络共享启动失败");}});}} catch (Exception e) {e.printStackTrace();}}
}

3、 网络接口节点

Android 设备:通常为 rndis0usb0,通过ifconfig可以看到节点信息。

4、USB网络共享开启成功后的ifconfig显示

# ifconfig//wifi节点信息:
wlan0     Link encap:Ethernet  HWaddr 54:78:c9:14:65:a2inet addr:192.141.1.57  Bcast:192.141.3.255  Mask:255.255.252.0 inet6 addr: fe80::9643:193:1d0:f652/64 Scope: LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:107803 errors:0 dropped:431 overruns:0 frame:0 TX packets:10688 errors:0 dropped:163 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:152613737 TX bytes:1329876 //USB网络节点信息:
rndis0    Link encap:Ethernet  HWaddr 6a:d8:b3:8e:bd:90  Driver configfs-gadget.g1inet addr:192.168.146.152  Bcast:192.168.146.255  Mask:255.255.255.0 inet6 addr: fe80::68d8:b3ff:fe8e:bd90/64 Scope: LinkUP BROADCAST MULTICAST  MTU:1500  Metric:1RX packets:4180 errors:0 dropped:4 overruns:0 frame:0 TX packets:4336 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:667865 TX bytes:4169392 console:/ # 

未开启USB网络共享功能前,ifconfig是看不到rndis0节点的。

但是在如果ifconfig -a 都看不到rndis0,有可能就是底层未加载USB网络共享节点,就不会显示USB网络共享选项。

代码查看USB网络共享节点连接情况;

// 获取网络共享状态
boolean isTethering = connManager.isTetheringActive(ConnectivityManager.TETHERING_USB);// 获取已连接的网络共享设备
List<String> tethered = connManager.getTetheredIfaces();

电脑成功连接USB网络分享后,adb是会断开的,adb devices 是没有设备列表的。

关闭USB网络共享后,才能正常adb devices 看到adb 列表设备。

5、调试与故障排除

(1)查看网络接口
adb shell ifconfig
adb shell ifconfig -a
# 查找类似 rndis0 或 usb0 的接口
(2) 检查网络共享状态
adb shell dumpsys connectivity | grep Tethering
(3)日志分析
adb logcat | grep -E "Usb|Tethering|Connectivity"

4、手动启用(Root 设备)

adb shell
su
svc usb setFunctions rndis,adb  # 设置 USB 功能为 RNDIS+ADB

不一定有用,因为大部分系统不支持这个命令:

console:/ # svc usb setFunctions rndis,adb 
CANNOT LINK EXECUTABLE "app_process": library "libnativeloader.so" not found: needed by main executable
1|console:/ # 

三、其他

1、USB网络共享小结

(1)打开网络共享需要先连接电脑adb
(2)打开USB网络共享路径:设置 → 网络和互联网 → 热点和网络共享 → USB 网络共享
(3)USB网络共享打开成功后能在ifconfig查看到分享的ip路由信息
(4)如果USB网络共享选项不显示,有可能就是ifconfig -a 看不到 `rndis0` 或 `usb0`
(5)如果USB网络共享选项无法点击开启,有可能是未连接adb或者usb未打开
(6)打开USB网络共享后,adb是会关闭的,不能同时开启。

2、Android14 以太网共享功能 相关代码简介

Android 的以太网共享功能是啥?
其实就是 Android设备接入一个网线后,再接入电脑,电脑就可以分配到到一个ip;
这里的Android 设备就相当于一个路由器。
如果Android设备可以正常上网,那么电脑也是可以上网的;

Android 的以太网共享功能简单的说就是把Android设备的网络通过网线的形式共享给其他设备。

原文链接:https://blog.csdn.net/wenzhi20102321/article/details/141533109

除了USB网络共享、以太网共享,还有蓝牙网络共享,以及最常用的热点,都是网络共享的方式。

ps: 现在走的每一步,都在为未来积蓄力量,别停下,向前跑,光芒终会与你相遇!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/79817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Step1

项目 SchedulerSim 已搭建完成 ✅ ⸻ ✅ 你现在拥有的&#xff1a; • &#x1f527; 两种调度器&#xff08;Round Robin SJF&#xff09; • &#x1f4e6; 模拟进程类 Process • &#x1f9f1; 清晰结构&#xff1a;OOP 风格 便于扩展 • ✍️ 主函数已演示调度器运行效…

初探 Skynet:轻量级分布式游戏服务器框架实战

在游戏服务器开发领域&#xff0c;高效、稳定且易于扩展的框架一直是开发者追求的目标。Skynet 作为一款轻量级、高性能的分布式游戏服务器框架&#xff0c;凭借其独特的设计理念和强大的功能&#xff0c;赢得了众多开发者的青睐 一.Skynet底层架构支持 1.Actor erlang 从语言…

Oracle数据库中,WITH..AS 子句用法解析

前言 在Oracle数据库中&#xff0c;WITH子句&#xff08;也成为“子查询因子化” 或“公共表表达式”&#xff0c;Common Table Expression, CTE)用于定义一个临时命名的结果集&#xff0c;这个结果集可以在后续的查询中引用。 一、基本语法 WITH sjtab AS &#xff08;SELE…

什么是卫星电话?卫星电话与普通电话有什么区别?

在信息时代&#xff0c;通信技术已渗透到人类生活的方方面面&#xff0c;但传统地面通信网络仍存在盲区&#xff0c;无论是海洋、沙漠、高山&#xff0c;还是灾害现场&#xff0c;普通手机往往因基站信号无法覆盖而失效。此时&#xff0c;卫星电话便成为连接世界的“生命线”。…

【C/C++】高阶用法_笔记

1. 模板元编程&#xff08;TMP&#xff09;与编译时计算 (1) 类型萃取与 SFINAE 类型萃取&#xff08;Type Traits&#xff09;&#xff1a;利用模板特化在编译时推断类型属性。 template<typename T> struct is_pointer { static constexpr bool value false; };templ…

鸿蒙OSUniApp 实现一个精致的日历组件#三方框架 #Uniapp

使用 UniApp 实现一个精致的日历组件 前言 最近在开发一个约会小程序时&#xff0c;需要实现一个既美观又实用的日历组件。市面上虽然有不少现成的组件库&#xff0c;但都不太符合我们的设计需求。于是&#xff0c;我决定从零开始&#xff0c;基于 UniApp 自己实现一个功能完…

PyQt5完整指南:从入门到实践

引言 PyQt5是Python编程语言的一个GUI&#xff08;图形用户界面&#xff09;工具包&#xff0c;它是Qt5应用程序框架的Python绑定。Qt是一个跨平台的C应用程序开发框架&#xff0c;被广泛用于开发GUI程序和非GUI程序。PyQt5让Python开发者能够使用Python语言享受到Qt框架的强大…

Excel的详细使用指南

### **一、Excel基础操作** #### **1. 界面与基本概念** - **工作簿&#xff08;Workbook&#xff09;**&#xff1a;一个Excel文件&#xff08;扩展名.xlsx&#xff09;。 - **工作表&#xff08;Worksheet&#xff09;**&#xff1a;工作簿中的单个表格&#xff08;默认名…

Linux grep -r 查找依赖包是否存在依赖类 Class

方法一&#xff1a;通过 Linux &#xff0c;grep -r ClassPath 命令 grep -f org.apache.kafka.connect.source.SourceRecord在 jar 包所在 lib 或者 lib/plugins 目录下执行&#xff0c;grep -r&#xff0c; flink-sql-connector-sqlserver-cdc-3.3.0.jar 中此 kafka Source…

碎片笔记|AI生成图像溯源方法源码复现经验(持续更新中……)

前言&#xff1a;本篇博客分享一些溯源方法的复现经验&#xff0c;希望能帮助到大家&#x1f389;。 目录 1. Close-set AttributionRepmixDe-FakeDNA-Net 2. Open-set AttributionPOSE 3. Single-Model AttributionOCC-CLIPLatentTracer 1. Close-set Attribution Repmix 论…

SAP Fiori Elements Object Page

🏰 SAP Fiori Elements Object Page:魔法积木城堡的建造秘密 想象一下,你曾经去过一个神奇的乐高主题公园,在那里,城堡会根据你的设计图纸自动搭建,而你只需要提供一张设计说明书,不必亲自摆放每一块积木!这就是SAP Fiori Elements Object Page的渲染魔法! 🧙‍♂…

Git 用户名与邮箱配置全解析:精准配置——基于场景的参数选择

目录 一、配置查看&#xff1a;理解多层级配置体系二、精准配置&#xff1a;基于场景的参数选择1. 仓库级配置&#xff08;推荐&#xff09;2. 用户级配置3. 系统级配置 三、历史提交信息修改1. 修改最近一次提交2. 修改多个历史提交&#xff08;危险操作&#xff09; 五、配置…

Fabric系列 - SoftHSM 软件模拟HSM

在 fabric-ca-server 上使用软件模拟的 HSM(密码卡) 功能 安装 SoftHSMv2 教程 SoftHSMv2 默认的配置文件 /etc/softhsm2.conf默认的token目录 /var/lib/softhsm/tokens/ 初始化和启动fabric-ca-server&#xff0c;需要设置一个管理员用户的名称和密码 初始化令牌 # 初始…

医学影像系统的集成与工作流优化

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…

转发多台px4仿真UDP数据到地面站

转发脚本的任务需求 仿真采用UDP通信方式&#xff0c;在 wsl 中仿真三台飞机&#xff0c;项目需要将一台电脑中的三台飞机的数据打包发送到另一台飞机的地面站&#xff0c;但地面站是无法直接访问另一台主机的 wsl 中的端口的&#xff0c;wsl 中的端口需要本机才能访问&#x…

FPGA图像处理(五)------ 图片水平镜像

利用bram形成双缓冲&#xff0c;如下图配置所示&#xff1a; wr_flag 表明 buffer0写 还是 buffer1写 rd_flag 表明 buffer0读 还是 buffer1读 通过写入逻辑控制(结合wr_finish) 写哪个buffer &#xff1b;写地址 进而控制ip的写使能 通过状态缓存来跳转buffer的…

微服务八股(自用)

微服务 SpringCloud 注册中心&#xff1a;Eureka 负载均衡&#xff1a;Ribbon 远程调用&#xff1a;Feign 服务熔断&#xff1a;Hystrix 网关&#xff1a;Gateway/Zuul Alibaba 配置中心&#xff1a;Nacos 负载均衡&#xff1a;Ribbon 服务调用&#xff1a;Feign 服务…

ESP32_IDF_OTA_HTTP升级固件

ESP32_IDF_OTA_HTTP升级固件 前言&#xff1a;一个项目的主控使用的是ESP32&#xff0c;因为封装外壳的原因&#xff0c;所以需要采用OTA的方式进行升级&#xff0c;因为之前有对WIFI的OTA有所了解&#xff0c;所以在此基础上&#xff0c;使用官方提供的native_ota_example例程…

MySQL表结构化:数据类型与表生命周期详解

引言 各位数据库学习者大家好&#xff01;今天我们将深入探讨MySQL中最核心的对象——表&#xff08;Table&#xff09;的各类操作 &#x1f3af;。表是存储数据的基石&#xff0c;就像Excel中的工作表一样&#xff0c;但功能要强大得多&#xff01;无论是电商网站的用户信息&…

React中的状态管理Dva总结

在 React 开发中&#xff0c;随着应用的复杂度增加&#xff0c;如何高效地管理应用状态成为了一个非常重要的问题。为了解决这一问题&#xff0c;很多开发者选择了 Redux&#xff0c;然而 Redux 的学习曲线较陡&#xff0c;且需要配置较多的样板代码。为此&#xff0c;Ant Desi…