Android frameworks 开发总结之十(lock screen message Battery Last full charge)

本文主要是介绍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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/432572

相关文章

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并