Android設備 顯示充電速度流程

整體邏輯:設備充電速度的判斷

系統通過讀取充電器的最大電流(Current)最大電壓(Voltage),計算最大充電功率(Wattage),以此判斷當前是慢充、普通充還是快充:

  • 如果 maxChargingWattage <= 0:返回 CHARGING_UNKNOWN,說明未插電或讀取失敗;

  • 如果 maxChargingWattage < slowThreshold:返回 CHARGING_SLOWLY

  • 如果 maxChargingWattage > fastThreshold:返回 CHARGING_FAST

  • 否則:返回 CHARGING_REGULAR


1. Framework 層判斷邏輯

public final int getChargingSpeed(Context context) {final int slowThreshold = context.getResources().getInteger(R.integer.config_chargingSlowlyThreshold);final int fastThreshold = context.getResources().getInteger(getFastChargingThresholdResId());return maxChargingWattage <= 0 ? CHARGING_UNKNOWN :maxChargingWattage < slowThreshold ? CHARGING_SLOWLY :maxChargingWattage > fastThreshold ? CHARGING_FAST :CHARGING_REGULAR;
}
  • 根據從 HAL 層傳來的 maxChargingWattage 判斷充電速度;

  • 閾值由資源文件 config.xml 提供(如下所示):

<!-- config.xml -->
<integer name="config_chargingSlowlyThreshold">3000000</integer> <!-- 3W -->
<integer name="config_chargingFastThreshold">12000000</integer> <!-- 12W -->
<integer name="config_chargingFastThreshold_v2">21000000</integer> <!-- 21W (用于新設備) -->

2. 最大充電功率的計算邏輯

frameworks/base/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryStatus.java

從 Intent 提取電流電壓并計算功率

private static int calculateMaxChargingMicroWatt(Intent batteryChangedIntent) {final int maxChargingMicroAmp = batteryChangedIntent.getIntExtra(EXTRA_MAX_CHARGING_CURRENT, -1);int maxChargingMicroVolt = batteryChangedIntent.getIntExtra(EXTRA_MAX_CHARGING_VOLTAGE, -1);return calculateMaxChargingMicroWatt(maxChargingMicroAmp, maxChargingMicroVolt);
}
  • 作用:batteryChangedIntent(電池廣播 Intent)中讀取兩個字段:

    • EXTRA_MAX_CHARGING_CURRENT:最大充電電流,單位為 微安(μA)

    • EXTRA_MAX_CHARGING_VOLTAGE:最大充電電壓,單位為 微伏(μV)

  • 若讀取失敗(無此字段),會返回默認值 -1

  • 然后調用重載的 calculateMaxChargingMicroWatt(int, int) 方法進行功率計算。

?根據電流電壓計算功率

private static int calculateMaxChargingMicroWatt(int maxChargingMicroAmp, int maxChargingMicroVolt) {if (maxChargingMicroVolt <= 0) {maxChargingMicroVolt = DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT;}if (maxChargingMicroAmp > 0) {return (int) Math.round(maxChargingMicroAmp * 0.001 * maxChargingMicroVolt * 0.001); // 轉換為 mA * mV = μW} else {return -1;}
}
  • 電壓校驗

    if (maxChargingMicroVolt <= 0)

    • 若未獲取到有效電壓(為0或負數),使用默認值 DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT(通常為 5000000,即 5V)。

  • 功率計算

    return (int) Math.round(maxChargingMicroAmp * 0.001 * maxChargingMicroVolt * 0.001);

    • 先將 μA 和 μV 轉換成 mA 和 mV:

      • maxChargingMicroAmp * 0.001:μA ? mA

      • maxChargingMicroVolt * 0.001:μV ? mV

    • 計算公式:

      PuW=ImA×VmVP_{uW} = I_{mA} \times V_{mV}PuW?=ImA?×VmV?

      單位為微瓦(μW)

  • 返回無效值

    • 若電流無效(≤ 0),則返回 -1,表示無法計算有效功率。


3. 數據來源:HAL 層讀取電流/電壓

void BatteryMonitor::updateValues(void) {...for (每個充電器 charger) {讀取 charger 的 current_max 節點 -> ChargingCurrent讀取 charger 的 voltage_max 節點 -> ChargingVoltagedouble power = (ChargingCurrent / 1_000_000.0) * (ChargingVoltage / 1_000_000.0);如果 power 比之前最大值大:保存該電流電壓到 mHealthInfo}
}
  • HAL 遍歷 /sys/class/power_supply/ 下的所有充電器節點;

  • 從每個 charger 的 current_maxvoltage_max 讀取最大支持值;

  • 計算每個充電器功率并取最大值填入 mHealthInfo

  • mHealthInfo.maxChargingCurrentMicroampsmaxChargingVoltageMicrovolts 將最終傳給 Framework 層。


4. Kernel 層提供節點值

#define NORMAL_CHARGING_CURR_UA 500000     // 普通 USB:500mA
#define FAST_CHARGING_CURR_UA   1500000    // 快充口:1.5Astatic int mt6375_chg_get_property(...) {switch (psp) {case POWER_SUPPLY_PROP_CURRENT_MAX:if (type == USB) val->intval = NORMAL_CHARGING_CURR_UA;else if (type == USB_DCP) val->intval = FAST_CHARGING_CURR_UA;break;case POWER_SUPPLY_PROP_VOLTAGE_MAX:val->intval = vbus_global; // 動態返回當前 vbus 電壓break;}
}
  • Kernel 驅動根據充電口類型(如 USB、USB_DCP)返回對應最大電流;

  • 電壓通過變量 vbus_global 實時獲取;

  • 這些值最終通過 power_supply 框架上傳給 HAL 層讀取。


?流程總結

[Kernel] 驅動讀取 current_max & voltage_max 節點
? ? ?↓
[HAL] BatteryMonitor 計算最大功率并存入 mHealthInfo
? ? ?↓
[Framework] BatteryStatus 讀取 Intent 中傳來的最大 μA/μV,換算為 μW
? ? ?↓
getChargingSpeed() 對比 config 閾值,判斷是快充/慢充/普通

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906301.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906301.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906301.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

十一、Hive JOIN 連接查詢

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月16日 專欄&#xff1a;Hive教程 在數據分析的江湖中&#xff0c;數據往往分散在不同的“門派”&#xff08;表&#xff09;之中。要洞察數據間的深層聯系&#xff0c;就需要JOIN這把利器&#xff0c;將相關聯的數據串聯起來…

Excel在每行下面插入數量不等的空行

1、在B列輸入要添加的空行數量&#xff08;如果加7行&#xff0c;則寫6&#xff0c;也可以插入數量不等的空行&#xff09; 2、在C1單元格輸入1 3、在C2輸入公式&#xff1a;SUM($B$1:B1)1&#xff0c;下拉填充 4、在C9單元格輸入1 5、選中C9單元格-->選擇菜單欄“開始”…

iOS熱更新技術要點與風險分析

iOS的熱更新技術允許開發者在無需重新提交App Store審核的情況下&#xff0c;動態修復Bug或更新功能&#xff0c;但需注意蘋果的審核政策限制。以下是iOS熱更新的主要技術方案及要點&#xff1a; 一、主流熱更新技術方案 JavaScript動態化框架 React Native & Weex 通過Jav…

服務器多用戶共享Conda環境操作指南——Ubuntu24.02

1. 使用阿里云鏡像下載 Anaconda 最新版本 wget https://mirrors.aliyun.com/anaconda/archive/Anaconda3-2024.02-1-Linux-x86_64.sh bug解決方案 若出現&#xff1a;使用wget在清華鏡像站下載Anaconda報錯ERROR 403: Forbidden. 解決方案&#xff1a;wget --user-agent“M…

基于YOLO算法的目標檢測系統實現指南

YOLO(You Only Look Once)作為計算機視覺領域最具影響力的實時目標檢測算法之一&#xff0c;其最新版本YOLOv8在速度與精度之間達到了新的平衡。本文將從技術實現角度&#xff0c;詳細介紹如何使用YOLO算法構建高效的目標檢測系統。 一、算法原理與技術架構 1.1 YOLO核心思想…

C++ asio網絡編程(6)利用C11模擬偽閉包實現連接的安全回收

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、智能指針管理Session二、用智能指針來實現Server的函數1.start_accept()1.引用計數注意點2.std::bind 與異步回調函數的執行順序分析 2.handle_accept1.異步…

AI與產品架構設計(2):Agent系統的應用架構與落地實

什么是AI Agent&#xff1f;其在架構中的獨特定位 AI Agent&#xff08;人工智能代理&#xff09;是一種模擬人類智能行為的自主系統&#xff0c;通常以大型語言模型&#xff08;LLM&#xff09;作為核心引擎。簡單來說&#xff0c;Agent能夠像人一樣感知環境信息、規劃行動方…

Rust 數據結構:String

Rust 數據結構&#xff1a;String Rust 數據結構&#xff1a;String什么是字符串&#xff1f;創建新字符串更新字符串將 push_str 和 push 附加到 String 對象后使用 運算符和 format! 宏 索引到字符串字符串在內存中的表示字節、標量值和字形簇 分割字符串遍歷字符串的方法 R…

Java卡與SSE技術融合實現企業級安全實時通訊

簡介 在數字化轉型浪潮中,安全與實時數據傳輸已成為金融、物聯網等高安全性領域的核心需求。本文將深入剖析東信和平的Java卡權限分級控制技術與浪潮云基于SSE的大模型數據推送技術,探索如何將這兩項創新技術進行融合,構建企業級安全實時通訊系統。通過從零到一的開發步驟,…

繼MCP、A2A之上的“AG-UI”協議橫空出世,人機交互邁入新紀元

第一章&#xff1a;AI交互的進化與挑戰 1.1 從命令行到智能交互 人工智能的發展歷程中&#xff0c;人機交互的方式經歷了多次變革。早期的AI系統依賴命令行輸入&#xff0c;用戶需通過特定指令與機器溝通。隨著自然語言處理技術的進步&#xff0c;語音助手和聊天機器人逐漸普…

MySQL刷題相關簡單語法集合

去重 distinct 關鍵字 eg. &#xff1a;select distinct university from user_profile 返回行數限制&#xff1a; limit關鍵字 eg. &#xff1a;select device_id from user_profile limit 2 返回列重命名&#xff1a;as 關鍵字 eg.&#xff1a;select device_id as user_in…

Kubernetes MCP服務器(K8s MCP):如何使用?

#作者&#xff1a;曹付江 文章目錄 1、什么是 Kubernetes MCP 服務器&#xff1f;1.1、K8s MCP 服務器 2、開始前的準備工作2.1. Kubernetes集群2.2. 安裝并運行 kubectl2.3. Node.js 和 Bun2.4. &#xff08;可選&#xff09;Helm v3 3、如何設置 K8s MCP 服務器3.1. 克隆存儲…

計算機網絡-HTTP與HTTPS

文章目錄 計算機網絡網絡模型網絡OSITCP/IP 應用層常用協議HTTP報文HTTP狀態碼HTTP請求類型HTTP握手過程HTTP連接HTTP斷點續傳HTTPSHTTPS握手過程 計算機網絡 網絡模型 為了解決多種設備能夠通過網絡相互通信&#xff0c;解決網絡互聯兼容性問題。 網絡模型是計算機網絡中用于…

Springboot 跨域攔截器配置說明

錯誤代碼 跨域設置 Configuration public class WebConfig implements WebMvcConfigurer {/*** cors 跨域配置*/Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedMethods("GET", "HEAD", &qu…

受不了github的網絡限制了,我開源了一個圖床工具 gitee-spring-boot-starter

嗨嗨嗨~ 我老馬又又來了&#xff01;&#xff01;&#xff01;上次寫了一篇我開源了一款阿里云OSS的spring-boot-starter&#xff0c;然后買的資源包到期了&#xff0c;后面又想白&#xff08;開&#xff09;嫖&#xff08;源&#xff09;的路子&#xff0c;首先想到了使用gith…

基于labview的聲音采集、存儲、處理

程序1&#xff1a;基于聲卡的數據采集 程序2&#xff1a;基于聲卡的雙聲道模擬輸出 程序3&#xff1a;聲音信號的采集與存儲 程序4&#xff1a;聲音信號的功率譜分析 程序5&#xff1a;基于labview的DTMF

第一次經歷項目上線

這幾天沒寫csdn&#xff0c;因為忙著項目上線的問題&#xff0c;我這階段改了非常多的前端bug哈哈哈哈&#xff0c;說幾個比較好的bug思想&#xff01; 這個頁面算是我遇到的比較大的bug&#xff0c;因為我一開始的邏輯都寫好了&#xff0c;詢價就是在點擊快遞公司彈出彈框的時…

基于EFISH-SCB-RK3576/SAIL-RK3576的消防機器人控制器技術方案?

&#xff08;國產化替代J1900的應急救援智能化解決方案&#xff09; 一、硬件架構設計? ?極端環境防護系統? ?防爆耐高溫設計?&#xff1a; 采用陶瓷纖維復合裝甲&#xff08;耐溫1200℃持續1小時&#xff09;&#xff0c;通過GB 26784-2023消防設備防爆認證IP68防護等級…

企業開發工具git的使用:從入門到高效團隊協作

前言&#xff1a;本文介紹了Git的安裝、本地倉庫的創建與配置&#xff0c;以及工作區、暫存區和版本庫的區分。詳細講解了版本回退、撤銷修改等操作&#xff0c;并深入探討了分支管理&#xff0c;包括分支的創建、切換、合并、刪除及沖突解決。此外&#xff0c;還介紹了遠程操作…

Java反射機制詳解:原理、應用與實戰

一、反射機制概述 Java反射(Reflection)是Java語言的一個強大特性&#xff0c;它允許程序在運行時(Runtime)獲取類的信息并操作類或對象的屬性、方法等。反射機制打破了Java的封裝性&#xff0c;但也提供了極大的靈活性。 反射的核心思想&#xff1a;在運行時而非編譯時動態獲…