我正在尝试运行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/

10-10 10:13