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.pswp.cn/web/79817.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79817.shtml
英文地址,請注明出處:http://en.pswp.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…