我正在尝试运行Android应用程序后查找电池电量。当手机启动应用程序完全充满电时,该代码始终返回100%的电池电量(即使电量耗尽)。如果我使用75%的电池或其他电量启动应用程序,则它会在测试结束时返回实际的电池电量。我先将手机插入计算机,然后继续充电,然后再执行应用程序,然后拔出电源,开始测试。理想情况下,我希望能够获得开始%和结束%,但两者都读为100%。所以这就是我在做什么...我从活动中称呼它为
this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
然后在BroadcastReceiver中,我做了很多事情(这需要一个多小时,因此电池电量会发生变化)。然后在BoradcastReceiver的结尾,我称之为
int level2 = intent.getIntExtra("level", 0); /* Ending battery level */
String end = "Ending battery level: " + String.valueOf(level2) + "%";
然后将String结尾发送到服务器。
这是我的代码:
package com.mdog.datareceive;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.PowerManager;
import android.util.Log;
import android.widget.TextView;
public class Receive extends Activity {
/* Test parameters */
static int BYTES_TO_READ = 1024*1024*50; /* The size of the data for each transfer */
static int TIMES_TO_READ = 20; /* The number of times the client will request the data */
static int PLAYER_BUFFER_SIZE = 1638400; /* Clients buffer size 1638400 = 1.57MB */
static int SLEEP_TIME_MS = 5000;
/* Display Info */
String start = "empty"; /* String holder for the starting battery life */
String end = "empty2"; /* String holder for the ending battery life */
int allMBytes = 0; /* Integer holder for the total number of megabytes received during the test */
TextView tv; /* The view the phone displays after completion of test */
/* Server Info */
String serverIP = "192.168.0.104"; /* Server IP */
int serverPort = 11313; /* Server port number */
private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent intent) {
//int level = intent.getIntExtra("level", 0);
Socket connectionSocket = null; /* Socket to communicate with server */
byte[] inputHolderByteArray = new byte[PLAYER_BUFFER_SIZE]; /* Used to read from the socket */
int bufferBytes = 0; /* filling the second buffer */
int totalBytesRead = 0; /* The total number of bytes read for this transfer round */
int read=0; /* reading from stream, will contain the number of bytes read or -1 if the end has been hit */
/* Acquire a wake lock for the phone so it does not go to sleep */
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, getClass().getName());
/* Connect to Server */
try {
connectionSocket = new Socket(serverIP, serverPort);
connectionSocket.setReceiveBufferSize(PLAYER_BUFFER_SIZE); //1.5ish MB
connectionSocket.setKeepAlive(true);
PrintWriter out = new PrintWriter(connectionSocket.getOutputStream(), true);
out.print("Client Info: Bytes expected per transfer:" + BYTES_TO_READ + ", Number of transfer to request:" + TIMES_TO_READ+ ", Buffer size:" +PLAYER_BUFFER_SIZE+ ", Sleep time(ms):" + SLEEP_TIME_MS + "\n");
out.flush();
wl.acquire();
for(int i=0; i<TIMES_TO_READ; i++){
out.print("Start\n");
out.flush();
while(totalBytesRead < BYTES_TO_READ){
/* Read at most PLAYER_BUFFER_SIZE bytes */
read = connectionSocket.getInputStream().read(inputHolderByteArray, 0, PLAYER_BUFFER_SIZE);
if(read != -1){
bufferBytes += read;
totalBytesRead += read;
if(bufferBytes >= PLAYER_BUFFER_SIZE){
try {
Thread.sleep(SLEEP_TIME_MS);
} catch (InterruptedException e) {
e.printStackTrace();
}
bufferBytes = 0;
}
}
else{
/* End of stream reached */
break;
}
}
allMBytes += ((totalBytesRead/1024)/1024);
totalBytesRead = 0;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int level2 = intent.getIntExtra("level", 0); /* Ending battery level */
/* Put data on screen */
start = "Starting battery level: 100%";
end = "Ending battery level: " + String.valueOf(level2) + "%";
out.print("Test Completed: " + start + ", " + end + ", Megabytes Read: " + allMBytes + "\n");
out.flush();
wl.release();
tv.setText(start + " \n" + end + " \n Total MB transferred:" + allMBytes);
setContentView(tv);
} catch (UnknownHostException e) {
Log.i("UnknownHost exception ", " ******************** Log Msg UHE " + e.getLocalizedMessage());
e.printStackTrace();
} catch (IOException e2) {
Log.i("IO exception ", "******************** Log Msg IOE " + e2.toString());
e2.printStackTrace();
}
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
tv = new TextView(this); /* The view to post text to */
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}
}
最佳答案
首先,intent.getIntExtra("level", 0);
不是百分比。需要将intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 1)
与intent.getIntExtra(BatteryManager.EXTRA_SCALE, 1)
进行比较以获得百分比。
其次,不要在主应用程序线程(例如onReceive()
的BroadcastReceiver
)上进行网络I / O。
第三,您正在将电池电量与其自身进行比较。您需要等待下一个ACTION_BATTERY_CHANGED
广播来找出新的电池电量。
关于android - 使用Intent和BroadcastReceiver获取Android电池电量时的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4926469/