android关闭低电量提示(基于Android9.0电池温度异常提醒)(1)

阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android

本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

一、 Framework 层字符串添加

二、Service 中实时监测 电池异常温度并弹窗提醒用户

检测电池温度,提示用户温度异常,请注意

Android电池信息状态主要是在frameworks/base/services/core/java/com/android/server/BatteryService.java,本文也是基于此BatteryService实时监测 电池温度,及时提醒用户,为了安全起见,在电池温度异常时候,请勿继续充电。

一、 Framework 层字符串添加

1.添加弹窗字符串资源

alps/frameworks/base/core/res/res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> ... ... <!-- add NTC Test Case--> <string name="warningLowBatteryTemperature">"Battery temperature is too low, in order to protect battery life, charging function will be temporarily stopped."</string> <string name="warningHightBatteryTemperature">"Battery temperature is too high, in order to protect battery life, charging function will be temporarily stopped."</string> <string name="shutdownBatteryTemperatureMsg">"Battery temperature is too high. For safety reasons, the phone will shut down automatically later."</string> <string name="batteryTemperatureWarning">Warning</string> <string name="batteryTemperatureOk">"OK"</string> <!-- add NTC Test Case--> ... ... </resources>

2.添加自定义电池异常温度定义

自定义温度 主要修改alps/frameworks/base/core/res/res/values/config.xml

<?xml version="1.0" encoding="utf-8"?> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> ... ... <!-- Shutdown if the battery temperature exceeds (this value * 0.1) Celsius. --> <integer name="config_shutdownBatteryTemperature">680</integer> <!-- add NTC Test Case--> <integer name="config_warningHightBatteryTemperature">550</integer> <integer name="config_warningLowBatteryTemperature">0</integer> <!-- add NTC Test Case--> ... ... </resources>

3. 在symbols 文件中添加对应java-symbol方便Framework代码引用

在symbols文件中为所有string,int值注册,方便Framework层代码的引用。

alps/frameworks/base/core/res/res/values/symbols.xml

<?xml version="1.0" encoding="utf-8"?> <resources> <!-- Private symbols that we need to reference from framework code. See frameworks/base/core/res/MakeJavaSymbols.sed for how to easily generate this. Can be referenced in java code as: com.android.internal.R.<type>.<name> and in layout xml as: "@*android:<type>/<name>" --> ... ... <java-symbol type="integer" name="config_shutdownBatteryTemperature" /> <!-- add NTC Test Case--> <java-symbol type="integer" name="config_warningHightBatteryTemperature" /> <java-symbol type="integer" name="config_warningLowBatteryTemperature" /> <java-symbol type="string" name="warningLowBatteryTemperature" /> <java-symbol type="string" name="warningHightBatteryTemperature" /> <java-symbol type="string" name="shutdownBatteryTemperatureMsg" /> <java-symbol type="string" name="batteryTemperatureWarning" /> <java-symbol type="string" name="batteryTemperatureOk" /> <!-- add NTC Test Case-->

二、Service 中实时监测 电池异常温度并弹窗提醒用户

BatteryService后台服务可以实时监测 电池问题,当电池温度异常时候,我们要及时提醒用户,如果此时用户正在充电,提示请勿充电等。

实现方法如下:

//add NTC Test Case import android.app.AlertDialog; import android.view.WindowManager; import android.content.DialogInterface; //add NTC Test Case ... ... /** * <p>BatteryService monitors the charging status, and charge level of the device * battery. When these values change this service broadcasts the new values * to all {@link android.content.BroadcastReceiver IntentReceivers} that are * watching the {@link android.content.Intent#ACTION_BATTERY_CHANGED * BATTERY_CHANGED} action.</p> * <p>The new values are stored in the Intent data and can be retrieved by * calling {@link android.content.Intent#getExtra Intent.getExtra} with the * following keys:</p> * <p>"scale" - int, the maximum value for the charge level</p> * <p>"level" - int, charge level, from 0 through "scale" inclusive</p> * <p>"status" - String, the current charging status.<br /> * <p>"health" - String, the current battery health.<br /> * <p>"present" - boolean, true if the battery is present<br /> * <p>"icon-small" - int, suggested small icon to use for this state</p> * <p>"plugged" - int, 0 if the device is not plugged in; 1 if plugged * into an AC power adapter; 2 if plugged in via USB.</p> * <p>"voltage" - int, current battery voltage in millivolts</p> * <p>"temperature" - int, current battery temperature in tenths of * a degree Centigrade</p> * <p>"technology" - String, the type of battery installed, e.g. "Li-ion"</p> * * <p> * The battery service may be called by the power manager while holding its locks so * we take care to post all outcalls into the activity manager to a handler. * * FIXME: Ideally the power manager would perform all of its calls into the battery * service asynchronously itself. * </p> */ public final class BatteryService extends SystemService { // add NTC Test Case 定义电池温度检测所需变量 private int mConfigWarningLowBatteryTemperature; private int mConfigWarningHightBatteryTemperature; private String mWarningLowBatteryTemperature; private String mWarningHightBatteryTemperature; private String mShutdownBatteryTemperatureMsg; private AlertDialog mbatteryTemperatureDialog = null; //add NTC Test Case ... ... public BatteryService(Context context) { super(context); ... ... //add NTC Test Case BatteryService 构造获取电池检测所需资源 mConfigWarningLowBatteryTemperature= mContext.getResources().getInteger( com.android.internal.R.integer.config_warningLowBatteryTemperature); mConfigWarningHightBatteryTemperature= mContext.getResources().getInteger( com.android.internal.R.integer.config_warningHightBatteryTemperature); mWarningHightBatteryTemperature = mContext.getResources().getString( com.android.internal.R.string.warningHightBatteryTemperature); mShutdownBatteryTemperatureMsg = mContext.getResources().getString( com.android.internal.R.string.shutdownBatteryTemperatureMsg); mWarningLowBatteryTemperature = mContext.getResources().getString( com.android.internal.R.string.warningLowBatteryTemperature); //add NTC Test Case } private void processValuesLocked(boolean force) { ... ... shutdownIfNoPowerLocked(); shutdownIfOverTempLocked(); //add NTC Test Case //调用自定义电池温度异常检测方法 warningBatteryTemperature(); //add NTC Test Case ... ... } ... ... //add NTC Test Case 自定义判断电池温度是否异常 private void warningBatteryTemperature(){ if(mPlugType != BATTERY_PLUGGED_NONE && mHealthInfo!=null && mbatteryTemperatureDialog == null){ if (mHealthInfo.batteryTemperature >= mConfigWarningHightBatteryTemperature) { mHandler.post(new Runnable() { public void run() { if(mHealthInfo.batteryTemperature >= (mShutdownBatteryTemperature-10)){ batteryTemperatureDialog(mShutdownBatteryTemperatureMsg); }else{ batteryTemperatureDialog(mWarningHightBatteryTemperature); } } }); } if (mHealthInfo.batteryTemperature < mConfigWarningLowBatteryTemperature) { mHandler.post(new Runnable() { public void run() { batteryTemperatureDialog(mWarningLowBatteryTemperature); } }); } } } // 自定义电池温度Dialog弹窗 private void batteryTemperatureDialog(String batteryTemperature) { AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setTitle(mContext.getResources().getString( com.android.internal.R.string.batteryTemperatureWarning)); builder.setCancelable(false); builder.setMessage(batteryTemperature); builder.setIconAttribute(android.R.attr.alertDialogIcon); builder.setPositiveButton(com.android.internal.R.string.batteryTemperatureOk, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); mbatteryTemperatureDialog = null; } }); mbatteryTemperatureDialog = builder.create(); mbatteryTemperatureDialog.getWindow().setType( WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY); if (mbatteryTemperatureDialog != null&& !mbatteryTemperatureDialog.isShowing()) { mbatteryTemperatureDialog.show(); } } //add NTC Test Case ... ... }

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

,