Android frameworks 开发总结之十(lock screen message Battery Last full charge)
1.設置lock screen message後不显示
XXXt設備設置lock screen message後,發現鎖頻界面不顯示內容,像時間日期都不顯示。只在右上角顯示一個鎖圖標,需要向下滑動一下才能顯示出來。布局文件位置: frameworks/base/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml 修改:frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java中的layoutOwnerInfo方法:
private void layoutOwnerInfo() {if (mOwnerInfo != null && mOwnerInfo.getVisibility() != GONE) {// Animate owner info during wake-up transitionmOwnerInfo.setAlpha(1f - mDarkAmount);float ratio = mDarkAmount;// Calculate how much of it we should crop in order to have a smooth transitionint collapsed = mOwnerInfo.getTop() - mOwnerInfo.getPaddingTop();int expanded = mOwnerInfo.getBottom() + mOwnerInfo.getPaddingBottom();int toRemove = (int) ((expanded - collapsed) * ratio);mOwnerInfo.setTop(mIconTopMarginWithHeader * 4);setBottom(getMeasuredHeight() - 50);if (mNotificationIcons != null) {// We're using scrolling in order not to overload the translation which is used// when appearing the iconsmNotificationIcons.setScrollY(toRemove);}} else if (mNotificationIcons != null){mNotificationIcons.setScrollY(0);}}
在其它设备上(在横屏的情况下不显示lock screen message,原因是字体过大导致的,修改方式:
private void updateOwnerInfo() {if (mOwnerInfo == null) return;String info = mLockPatternUtils.getDeviceOwnerInfo();if (info == null) {// Use the current user owner information if enabled.final boolean ownerInfoEnabled = mLockPatternUtils.isOwnerInfoEnabled(KeyguardUpdateMonitor.getCurrentUser());if (ownerInfoEnabled) {info = mLockPatternUtils.getOwnerInfo(KeyguardUpdateMonitor.getCurrentUser());}}mOwnerInfo.setText(info);mOwnerInfo.setTextSize(24);updateDark();
}
2.锁屏界面上charging和emergency call位置不正确
Jaws设备上在横屏的情况下charging和emergency call位置不正确. 布局文件:frameworks/base/packages/SystemUI/res/layout/keyguard_bottom_area.xml . 修改布局文件中的android:layout_marginBottom属性
<include layout="@layout/keyguard_emergency_carrier_area"android:id="@+id/keyguard_selector_fade_container"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="8dp"android:orientation="vertical"android:layout_gravity="bottom|center_horizontal"android:gravity="center_horizontal" />
3.修改Battery Last full charge
XXX設備有外部電池,所以last full charge需要考慮當拔掉充電線時候,檢測外部電池電量。last full charge的更新在: frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java文件中.当手机充满电后,如果拔掉充电器,则会以setBatteryStateLocked() → setOnBatteryLocked() → resetAllStatsLocked() → initTimes()的调用顺序,将mStartClockTime设置为当前系统时间。从而在Settings中提示上次充满电为0分钟前。Patch如下:
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index 15b1d75..5bb031c 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -161,4 +161,5 @@ interface IBatteryStats {/** {@hide} */boolean setChargingStateUpdateDelayMillis(int delay);
+ void setAmarBatteryState(boolean isExist,int level);}
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 3113004..95df0ae 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -996,6 +996,8 @@ public class BatteryStatsImpl extends BatteryStats {private long[] mCpuFreqs;+ private boolean isAmarBatteryExist = false;
+ private int amarBatteryLevle = 0;@VisibleForTestingprotected PowerProfile mPowerProfile;@@ -10401,12 +10403,14 @@ public class BatteryStatsImpl extends BatteryStats {}void initTimes(long uptime, long realtime) {
- mStartClockTime = System.currentTimeMillis();//開機初始化或者外部電池不存在時候更新或者外部電池存在並且電量大於等於90的時候
+ if(mStartClockTime == 0 || (isAmarBatteryExist && amarBatteryLevle >= 90) || (!isAmarBatteryExist)){
+ mStartClockTime = System.currentTimeMillis();
+ mRealtimeStart = realtime;
+ }mOnBatteryTimeBase.init(uptime, realtime);mOnBatteryScreenOffTimeBase.init(uptime, realtime);mRealtime = 0;mUptime = 0;
- mRealtimeStart = realtime;mUptimeStart = uptime;}@@ -12419,6 +12423,11 @@ public class BatteryStatsImpl extends BatteryStats {mMaxLearnedBatteryCapacity = Math.max(mMaxLearnedBatteryCapacity, chargeFullUAh);}+ public void setAmarBatteryState(boolean isExist,int level){
+ isAmarBatteryExist = isExist;
+ amarBatteryLevle = level;
+ }
+public static boolean isOnBattery(int plugType, int status) {return plugType == BATTERY_PLUGGED_NONE && status != BatteryManager.BATTERY_STATUS_UNKNOWN;}
diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java
index acac12e..7362aa0 100644
--- a/services/core/java/com/android/server/BatteryService.java
+++ b/services/core/java/com/android/server/BatteryService.java
@@ -537,6 +537,30 @@ public final class BatteryService extends SystemService {// Let the battery stats keep track of the current level.try {
+ if (batread == null) {
+ batread = IBatread2.getService(true);
+ }
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Got second battery error 1: ", e);
+ }
+
+ try {
+ if(checkAmarBatteryError()){
+ mBatteryStats.setAmarBatteryState(false, 0);
+ }else {
+ boolean isAmarBatteryExist = checkAmarBatteryExist();
+ int amarBatteryLevel = 0;
+ if (isAmarBatteryExist && batread != null) {
+ try {
+ if (batread != null) {
+ amarBatteryLevel = batread.batteryread2("bms_ext/capacity");
+ }
+ } catch (Exception e) {
+ Slog.w(TAG, "batteryread2 error: ", e);
+ }
+ }
+ mBatteryStats.setAmarBatteryState(isAmarBatteryExist, amarBatteryLevel);
+ }mBatteryStats.setBatteryState(mHealthInfo.batteryStatus, mHealthInfo.batteryHealth,mPlugType, mHealthInfo.batteryLevel, mHealthInfo.batteryTemperature,mHealthInfo.batteryVoltage, mHealthInfo.batteryChargeCounter,
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index a47ea4f..24eac58 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -1164,6 +1164,12 @@ public final class BatteryStatsService extends IBatteryStats.Stub});}+ public void setAmarBatteryState(boolean isExist,int level){
+ if(mStats != null){
+ mStats.setAmarBatteryState(isExist,level);
+ }
+ }
+public long getAwakeTimeBattery() {mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BATTERY_STATS, null);
相关文章:
Android frameworks 开发总结之十(lock screen message Battery Last full charge)
1.設置lock screen message後不显示 XXXt設備設置lock screen message後,發現鎖頻界面不顯示內容,像時間日期都不顯示。只在右上角顯示一個鎖圖標,需要向下滑動一下才能顯示出來。布局文件位置: frameworks/base/packages/SystemUI/res-keygu…...

[建议收藏] 一个网站集合所有最新最全的AI工具
今天给大家推荐一个宝藏的AI工具合集网站,有了这个网站,你们再也不用去其他地方找AI工具了。 名称:AI-BOT工具集 这个网站精选1000AI工具,并持续每天更新添加,包括AI写作、AI绘画、AI音视频处理、AI平面设计、AI自动编…...
嵌入式硬件基础知识——1
目录 SOC、MCU、MPU、CPU SPI STM32的时钟系统 can是什么 串口和并口 传感器输出引脚高阻抗好还是低阻抗好? iic 运算放大器特点 MOS管和三极管 同步电路和异步电路 SOC、MCU、MPU、CPU SOC 片上系统 手机的核心芯片 MCU 微控系统 单片机 MPU 嵌入式微处…...

Spring如何在多线程下保持事务的一致性
Spring如何在多线程下保持事务的一致性 方法:每个线程都开启各自的事务去执行相关业务,等待所有线程的业务执行完成,统一提交或回滚。 下面我们通过具体的案例来演示Spring如何在多线程下保持事务的一致性。 1、项目结构 2、数据库SQL CR…...

外部中断为什么会误触发?
今天在写外部中断的程序的时候,发现中断特别容易受到干扰,我把手放在对应的中断引脚上,中断就一直触发,没有停过。经过一天的学习,找到了几个解决方法,所以写了这篇笔记。如果你的中断也时不时会误触发&…...

【数据库】聊聊一颗B+树 可以存储多少数据
我们知道数据库使用的数据结构是B树,但是B树可以存储多少数据呢,在面试中也是经常会问的问题,所以我们从根上理解这个问题。 操作系统层面 数据都是存储在磁盘中的,而磁盘中的数据都是以最新单位扇区进行分割。一个扇区的大小是…...

【机器学习 | ARIMA】经典时间序列模型ARIMA定阶最佳实践,确定不来看看?
🤵♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…...

Python web自动化测试 —— 文件上传
文件上传三种方式: (一)查看元素标签,如果是input,则可以参照文本框输入的形式进行文件上传 方法:和用户输入是一样的,使用send_keys 步骤:1、找到定位元素,2&#…...

wpf使用CefSharp.OffScreen模拟网页登录,并获取身份cookie,C#后台执行js
目录 框架信息:MainWindow.xamlMainWindow.xaml.cs爬取逻辑模拟登录拦截请求Cookie获取 CookieVisitorHandle 框架信息: CefSharp.OffScreen.NETCore 119.1.20 MainWindow.xaml <Window x:Class"Wpf_CHZC_Img_Identy_ApiDataGet.MainWindow&qu…...

【代码随想录刷题】Day18 二叉树05
文章目录 1.【513】找树左下角的值1.1题目描述1.2 解题思路1.2.1 迭代法思路1.2.2 递归法思路 1.3 java代码实现1.3.1 迭代法java代码实现1.3.2 递归法java代码实现 2. 【112】路径总和2.1题目描述2.2 解题思路2.3 java代码实现 3.【106】从中序与后序遍历序列构造二叉树3.1题目…...

2023.11.25更新关于mac开发APP(flutter)的笔记与整理(实机开发一)
我自己写的笔记很杂,下面的笔记是我在chatgpt4的帮助下完成的,希望可以帮到正在踩坑mac开发APP(flutter)的小伙伴 目标:通过MAC电脑使用flutter框架开发一款适用于苹果手机的一个APP应用 本博客的阅读顺序是…...

万宾科技可燃气体监测仪的功能有哪些?
随着城市人口的持续增长和智慧城市不断发展,燃气作为一种重要的能源供应方式,已经广泛地应用于居民生活和工业生产的各个领域。然而燃气泄漏和安全事故的风险也随之增加,对城市的安全和社会的稳定构成了潜在的威胁。我国燃气管道安全事故的频…...
Binlog vs. Redo Log:数据库日志的较劲【高级】
🎏:你只管努力,剩下的交给时间 🏠 :小破站 Binlog vs. Redo Log:数据库日志的较劲【高级】 前言第一:事务的生命周期事务的生命周期Binlog和Redo Log记录事务的一致性和持久性Binlog的记录过程R…...

移动机器人路径规划(二)--- 图搜索基础,Dijkstra,A*,JPS
目录 1 图搜索基础 1.1 机器人规划的配置空间 Configuration Space 1.2 图搜索算法的基本概念 1.3 启发式的搜索算法 Heuristic search 2 A* Dijkstra算法 2.1 Dijkstra算法 2.2 A*&&Weighted A*算法 2.3 A* 算法的工程实践中的应用 3 JPS 1 图搜索基础 1.1…...

消息中间件——RabbitMQ(四)命令行与管控台的基本操作!
前言 在前面的文章中我们介绍过RabbitMQ的搭建:RabbitMQ的安装过以及各大主流消息中间件的对比:,本章就主要来介绍下我们之前安装的管控台是如何使用以及如何通过命令行进行操作。 1. 命令行操作 1.1 基础服务的命令操作 rabbitmqctl sto…...

性能压测工具:wrk
一般我们压测的时候,需要了解衡量系统性能的一些参数指标,比如。 1、性能指标简介 1.1 延迟 简单易懂。green:一般指响应时间 95线:P95。平均100%的请求中95%已经响应的时间 99线:P99。平均100%的请求中99%已经响应的时间 平…...
[Matlab有限元分析] 2.杆单元有限元分析
1. 一维杆单元有限元分析程序 一维刚单元的局部坐标系(单元坐标系)与全局坐标系相同。 1.1 线性杆单元 如图所示是一个杆单元,由两个节点i和j,局部坐标系的X轴沿着杆的方向,由i节点指向j节点,每个节点有…...

透过对话聊天聊网络tcp三次握手四次挥手
序 说起来网络,就让我想起的就是一张图。我在网上可以为所欲为,反正你又不能顺着网线来打我。接下来我们来详细说一下网络到底是怎么连接的。 TCP三次打招呼 首先我会用男女生之间的聊天方式,来举一个例子。 从tcp三次握手来说,…...

项目管理套路:看这一篇绝对够用❤️
写论文必不可少的,就是创建代码并进行实验。好的项目管理可以让实验进行得更加顺利。本篇博客以一次项目实践为例,介绍项目管理的方法,以及可能遇到的问题,并提供一些可行的解决方案。 目录 项目管理工具开始第一步版本管理十分关…...
华为-算法---测试开发工程师----摘要牛客网
Java面试题---摘要牛客网-CSDN博客package extendNiuKeWang;import java.util.Scanner;public class GoodHuaWei {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int money = sc.nextInt();System.out.println("n值总金额:"+money)…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...