1. 程式人生 > >android電池溫度報警

android電池溫度報警

基於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;
}
Android.mk檔案
#---------------------------------

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)

#----------------------------------------