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

相关文章

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超