1. 程式人生 > >電池報警來源 和 電池和電量關機設定修改

電池報警來源 和 電池和電量關機設定修改

基本思路:迴圈讀取裝置檔案,讀取到溫度值,傳送廣播給上層應用,廣播收到溫度值後UI提示
nt 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系統預設是電量為0關機的

/frameworks/base/services/java/com/android/server/BatteryService.java
電池這一塊自然少不了Android BatteryService,在adb shell中敲入:
dumpsys battery
輸出如下:
Current Battery Service state:
AC powered: false
USB powered: true
status: 2
health: 2
present: true
level: 54
scale: 100
voltage:3856
temperature: 300
technology: LiFe
其中的level就是電量等級,temperature是攝氏溫度,不過少了小數點,是30度。BatteyService中決定關機的就兩個,一個level,一個temperature
mBatteryLevel,就是系統的電壓等級,最大值是SCALE,也就是100,修改後低電關機相關的程式碼如下:

這裡寫圖片描述

mBatteryProps.batteryLevel 電量
mBatteryProps.batteryTemperature 電池溫度
mShutdownBatteryTemperature Android預設設定值680 在framworks中cord/res/velues/config設定關機溫度