基于mtk平台的电池温度报警
基本思路:循环读取设备文件,读取到温度值,发送广播给上层应用,广播收到温度值后UI提示。代码如下:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <cutils/properties.h>
#include <android/log.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <stdlib.h>
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "battery_warning",__VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "battery_warning",__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , "battery_warning",__VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , "battery_warning",__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , "battery_warning",__VA_ARGS__)
#define MAX_CHAR 100
#define MAX_LENGTH 1024
#define CMD "ps -t | grep ActivityManager"
#define FILE_NAME "/sys/devices/platform/mt-battery/BatteryNotify"
#define INTENT "am broadcast -n com.mediatek.batterywarning/com.mediatek.batterywarning.BatteryWarningReceiver -a android.intent.action.BATTERY_WARNING --ei type "
int systemServerStarted(const char *cmd)
{
LOGD("systemServerStarted: %s \n", cmd);
int res = 0;
char buf_ps[MAX_LENGTH];
char ps[MAX_LENGTH]={0};
FILE *ptr;
strcpy(ps, cmd);
if((ptr=popen(ps, "r")) != NULL)
{
while(fgets(buf_ps, MAX_LENGTH, ptr) != NULL) //通过ps命令查找ActivityManager是否存在
{
LOGD("cmd result: %s", buf_ps);
if(strlen(buf_ps) > 0)
{
res = 1;
break;
}
}
pclose(ptr);
ptr = NULL;
}
else
{
LOGE("popen error");
}
return res;
}
void readType(char* buffer) {
FILE * pFile;
pFile = fopen(FILE_NAME, "r"); //打开设备文件
if(pFile == NULL) {
LOGE("error opening file");
return;
} else {
if(fgets(buffer, MAX_CHAR, pFile) == NULL) {
LOGE("can not get the string from the file");
return;
}
}
int type = atoi(buffer); //转化为整形
if (type > 0 && systemServerStarted(CMD))
{
LOGD("start activity by send intent to BatteryWarningReceiver, type = %s", buffer);
char ps[MAX_LENGTH] = INTENT;
strcat(ps,buffer);
LOGD("os.system: %s", ps);
system(ps); //发送广播附件电池温度,给上层应用
}
fclose(pFile);
}
int main(int argc, char **argv)
{
char *buffer = (char*) malloc(MAX_CHAR * sizeof(char));
while(1) {
readType(buffer); //读取设备文件中温度值
sleep(10);
}
free(buffer);
return 0;
}
#---------------------------------
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := batterywarning.c
LOCAL_SHARED_LIBRARIES := libc libcutils
LOCAL_MODULE := batterywarning
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
#----------------------------------------