本文实例讲述了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编程实现添加低电流提醒功能的方法相关推荐

  1. android低电量提示,Android P系统低电量提醒功能 根据使用情况判断充电时间

    Android P系统是谷歌近几年以来变化最大的一个安卓系统,在I/O 2018上,谷歌已经正是宣布了Android P系统,并且面向vivo.OPPO.小米.一加.诺基亚等8个品牌的11款手机开放公 ...

  2. android获取键盘状态,Android获取屏幕方向及键盘状态的小例子

    Android获取屏幕方向及键盘状态的小例子 复制代码 代码如下: Configuration config = getResources().getConfiguration(); if (conf ...

  3. android app传递参数,Android APP调起另外一个APP并传值

    概述 为了增加用户体验,可能要求在一个APP中打开另外一个APP的需求,一般分为三种: 显式调用跳转 隐式调用跳转 URL Scheme跳转 代码 用到的一些公共方法,当打开APP时,检测到第三方AP ...

  4. android 序列化传参数,android 传值 序列化

    Activity之间传数据时,为了避免麻烦,往往会将一些值封装成对象,然后将整个对象传递过去.传对象的时候有两种情况,一种是实现Parcelable接口,一种是实现Serializable接口. 0. ...

  5. android 获取对话框对象,Android 基本Dialog和自定义Dialog

    Android 基本Dialog和自定义Dialog Dialog类是对话框的基类,但你应该避免直接实例化Dialog ,可以使用子类 1.AlertDialog 此对话框可以显示标题,最多三个按钮, ...

  6. kotlin android获取按钮,Kotlin Android按钮

    Android Button是用于在单击时执行事件的按钮.它是android.widget.Button类下的一个UI组件.要了解有关Android Button的更多信息, 请参阅Android B ...

  7. android 获取当前坐标,Android获取位置信息的方法

    本文实例为大家分享了Android获取位置信息的具体代码,供大家参考,具体内容如下 1.位置服务的简介:位置服务,英文翻译为Location-Based Services,缩写为LBS,又称为定位服务 ...

  8. android 获取wifi型号,android 获取连接WiFi的名称

    释放双眼,带上耳机,听听看~! 今天,简单讲讲如何获取连接的WiFi的名称. 首先AndroidMainfest.xml文件中添加权限: 然后直接获取WiFi名称 WifiManager wifiMg ...

  9. android获取activity截图,Android Activity 不能被截屏的解决方法

    Android Activity 不能被截屏的解决方法 在Activity 添加即可 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECU ...

最新文章

  1. python三层装饰器-2020 python学习第十六天————三层装饰器与迭代器
  2. 基于 ELK Stack 和 Spark Streaming 的日志处理平台设计与实现
  3. python人工智能面试题_人工智能面试题分享(含答案)
  4. 【ES6(2015)】Iterator
  5. 北航 计算机学院 2011级学生会,北航学生会主席在2011级新生开学典礼发言稿.doc...
  6. Map.Entry如何使用?
  7. java报错:java:xxx包不存在
  8. 【工具】之搭建个人博客
  9. iqoo支持typec耳机吗_动圈+动铁双单元的蓝牙耳机用过没?南卡T2无线耳机重磅来袭...
  10. EasyCHM chm文件制作过程及软件附软件下载地址
  11. 输入表重建工具ImportREC
  12. 微信公众号支付、支付查询、退款、退款查询、转账到零钱银行卡、转账查询接口整合(V2)
  13. mac 安装和升级go
  14. 华为设备DNS配置命令
  15. linux 怎么把新硬盘分区,linux添加新硬盘分区
  16. 编译安装Linux内核(以5.10.104版本为例)
  17. Eclipse的乱码问题是如何解决的
  18. 在pycharm下实现scrapy爬虫,解决NO module named‘‘Use “scrapy“ to see available commands的问题
  19. python处理teradata数据库_【Python连接数据库】Python连接Teradata数据库-ODBC方式(pyodbc包和teradata包)...
  20. [网络安全转载篇] Web安全学习及异或解密示例

热门文章

  1. Keil中取消结构体对齐的方法
  2. 易基因|m6A去甲基化酶ALKBH5通过降低PHF20 mRNA甲基化抑制结直肠癌进展 | 肿瘤研究
  3. 请注释你那该死的代码
  4. RAC 中GES/GCS原理
  5. ImageReader回调YUV数据转换成JPEG图片
  6. YOLOv5检测界面-PyQt5实现
  7. 如何对查询好的快递单号物流进行删除的几种方法
  8. 零配置初始化流程就一直过不去_大华可视对讲系统如何配置,一文了解配置细节...
  9. 计算机高级职称考试笔试题,计算机高级职称考试题目及答案
  10. 利用git提交网站到码云出现权限问题,弹框要求输入用户名和密码老是出错