Android编程实现添加低电流提醒功能的方法
时间:2022-07-27
本文章向大家介绍Android编程实现添加低电流提醒功能的方法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文实例讲述了Android编程实现添加低电流提醒功能的方法。分享给大家供大家参考,具体如下:
特殊需求,检测电流是否正常。
监听如下广播:
Intent.ACTION_BATTERY_CHANGED
plugType = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0);
if(mLowElectricityRemind == null){
mLowElectricityRemind = new LowElectricityRemind(BatteryMeterView.this.getContext());
}
mLowElectricityRemind.changePlugType(plugType);
添加LowElectricityRemind类
package com.android.systemui;
import android.content.Context;
import android.content.DialogInterface;
import android.os.BatteryManager;
import android.os.Handler;
import android.util.Slog;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import com.android.systemui.statusbar.phone.SystemUIDialog;
/**
* add low electricity remind
* Created by fanlj on 2017-2-18.
*/
public class LowElectricityRemind {
private static final String TAG = LowElectricityRemind.class.getSimpleName();
private static final int LOW_ELECTRICITY_REMIND_DELAYED = 50000;
private static final long REMIND_INTERVAL = 3 * 1000 * 60; //Three minutes
private static final int MAX_CURRENT_COUNT = 3;
private static final boolean DEBUG = true;
private boolean isFirstInitialize = true;
private Context mContext;
private Handler mHandler;
private int[] mCurrent = new int[MAX_CURRENT_COUNT];
private File mCurrentNowFile = null;
private SystemUIDialog mRemidDialog;
private long mLastPlugCurrent = 0;
private long mLastRemindTime = 0; //if mRemidDialog is showed, mLastRemindTime != 0
private boolean isIgnore = false;
LowElectricityRemind(Context context){
mContext = context;
mHandler = new Handler();
mCurrentNowFile = new File("/sys/class/power_supply/battery/current_now");
}
public void changePlugType(int type){
if(DEBUG) {
Slog.e(TAG, "change plug type to " + type);
}
mHandler.removeCallbacks(lowElectricityRemindRunnable);
if(type == BatteryManager.BATTERY_PLUGGED_AC || (DEBUG && type == BatteryManager.BATTERY_PLUGGED_USB)){
if(DEBUG) {
Slog.e(TAG, "start runnable");
}
if(isFirstInitialize){
isFirstInitialize = false;
}
mHandler.postDelayed(lowElectricityRemindRunnable, LOW_ELECTRICITY_REMIND_DELAYED);
} else {
cleanAllCache();
}
}
private Runnable lowElectricityRemindRunnable = new Runnable() {
@Override
public void run() {
if(!needShowRemindDialog(true)){
postDelayed();
return;
}
boolean isFull = true;
int cbattNow = readCurrent();
if(mLastPlugCurrent == cbattNow){
postDelayed();
return;
}
mLastPlugCurrent = cbattNow;
if(mCurrent[MAX_CURRENT_COUNT - 1] != 0){
int minIndex = 0;
int maxIndex = 0;
for (int i = MAX_CURRENT_COUNT; i 1; i--){
int curr = mCurrent[i];
if(mCurrent[minIndex] curr){
minIndex = i;
}
if(mCurrent[maxIndex] < curr){
maxIndex = i;
}
}
if(cbattNow < 0){ //In the charging
int min = mCurrent[minIndex];
int max = mCurrent[maxIndex];
if((min < 0 && min < cbattNow) || (min 0 && min cbattNow)){ //-1600 < -1400 900 800 if true, replace min value.
mCurrent[minIndex] = cbattNow;
} else if((max < 0 && max < cbattNow) || (max 0 && max cbattNow)){ //-1600 < -1400 900 800
mCurrent[maxIndex] = cbattNow;
}
}
} else {
for (int i = 0; i < MAX_CURRENT_COUNT; i++){
if(mCurrent[i] == 0){
mCurrent[i] = cbattNow;
if(i != MAX_CURRENT_COUNT - 1) {
isFull = false;
} else {
isFull = true;
}
break;
}
}
}
//if(isFull && needShowRemindDialog(false)){
if(isFull && needShowRemindDialog(true)){
if(mRemidDialog == null){
mRemidDialog = new SystemUIDialog(mContext);
mRemidDialog.setTitle(R.string.charge_current_warning_title);
mRemidDialog.setPositiveButton(R.string.charge_current_warning_yes, null);
mRemidDialog.setNegativeButton(R.string.charge_current_warning_ignore, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
isIgnore = true;
}
});
}
if(DEBUG && mRemidDialog.isShowing()){
mRemidDialog.dismiss();
}
if(!mRemidDialog.isShowing()){
String message = mContext.getString(R.string.charge_current_warning_content);
if(DEBUG){
message += "n";
for (int i = 0; i < MAX_CURRENT_COUNT; i++){
message += mCurrent[i];
message += " ";
}
}
mRemidDialog.setMessage(message);
mRemidDialog.show();
}
//clean all save
cleanAllCache();
mLastRemindTime = System.currentTimeMillis();
}
postDelayed();
}
};
private void postDelayed(){
mHandler.removeCallbacks(lowElectricityRemindRunnable);
mHandler.postDelayed(lowElectricityRemindRunnable, LOW_ELECTRICITY_REMIND_DELAYED);
}
private void cleanAllCache(){
for (int i = 0; i < MAX_CURRENT_COUNT; i++){
mCurrent[i] = 0;
}
mLastPlugCurrent = 0;
}
/**
* read battery current
* @return battery current
*/
private int readCurrent(){
int cbattNow = 0;
FileReader fileReader;
BufferedReader br;
try {
fileReader = new FileReader(mCurrentNowFile);
br = new BufferedReader(fileReader);
cbattNow = Integer.parseInt(br.readLine());
cbattNow = cbattNow / 1000; //uA to mA
br.close();
fileReader.close();
if(DEBUG) {
Slog.e(TAG, "last plug current : " + cbattNow);
}
} catch (FileNotFoundException e) {
Slog.e(TAG, "Failure in reading battery current", e);
} catch (IOException e) {
Slog.e(TAG, "Failure in reading battery current", e);
}
return cbattNow;
}
private boolean needShowRemindDialog(boolean filterData){
if(isIgnore){
return false;
}
boolean isNeedShow = true;
if(!filterData){
for (int i = 0; i < MAX_CURRENT_COUNT; i++){
if(mCurrent[i] <= 0){
isNeedShow = false;
break;
}
}
}
if(isNeedShow){
long currTime = System.currentTimeMillis();
if(DEBUG){
Slog.e(TAG, "mLastRemindTime = " + mLastRemindTime + " currTime = " + currTime);
}
if(mLastRemindTime == 0){
isNeedShow = true;
} else if(mLastRemindTime + REMIND_INTERVAL <= currTime){
isNeedShow = true;
} else{
isNeedShow = false;
}
}
if(DEBUG){
Slog.e(TAG, "need show remind dialog = " + isNeedShow);
}
return isNeedShow;
}
}
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android硬件相关操作与应用总结》、《Android文件操作技巧汇总》、《Android开发入门与进阶教程》、《Android资源操作技巧汇总》、《Android视图View技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
- 简陋的swift carthage copy-frameworks 辅助脚本
- 【自问自答】关于 Swift 的几个疑问
- 高级PHP应用程序漏洞审核技术【一】
- 【读书笔记】The Swift Programming Language (Swift 4.0.3)
- Ubuntu 下mysql常用操作
- JDK1.8源码(五)——java.util.ArrayList 类
- 代码审计入门总结
- ubuntu mysql启动|停止|重启
- JDK1.8源码(四)——java.util.Arrays 类
- JDK1.8源码(三)——java.lang.String 类
- JDK1.8源码(二)——java.lang.Integer 类
- Java关键字——instanceof
- 【强势推荐】一款可扫描CVE的工具
- Java的深拷贝和浅拷贝
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- OpenWRT结合tinc组自己的SDLAN
- 通过Cloudflare API更新DNS记录
- Vedastr:基于PyTorch的场景文本识别工具箱
- vue-element-admin项目关闭eslint校验
- 搞了半天,终于弄懂了TCP Socket数据的接收和发送,太难~
- 每天一个小技巧:CSS clip-path 的妙用 Clip Path分类Clippy
- 20 个值得学习的 Vue 开源项目
- 小白入门WEB前端编程,必看知识点!核心干货
- 新网站 Robots 和 SiteMap 优化
- Java代理IP池 ( Proxy Pool ) - 改进版
- Lvs+Keepalived 保障HA高可用
- 基于前端JS导出Excel文件(减轻服务端压力)
- 本机IDEA远程调试远端服务器代码
- 开源 - Java接口API授权认证与规范
- 亿及流量多级缓存 - 客户端缓存