Странное поведение при использовании намерения и BroadcastReceiver, чтобы получить уровень заряда батареи Android - PullRequest
2 голосов
/ 07 февраля 2011

Я пытаюсь определить уровень заряда батареи после запуска приложения для 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) + "%";

, а затем отправляю конец строки на сервер.

Вот как выглядит мой код:

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));
    }
}

Ответы [ 2 ]

1 голос
/ 08 февраля 2011

Во-первых, intent.getIntExtra("level", 0); не в процентах. intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 1) нужно сравнить с intent.getIntExtra(BatteryManager.EXTRA_SCALE, 1), чтобы получить процент.

Во-вторых, выполните НЕ , выполните сетевой ввод-вывод в главном потоке приложения, например onReceive() из BroadcastReceiver.

В-третьих, вы сравниваете уровень заряда батареи с самим собой. Вам нужно дождаться, когда next ACTION_BATTERY_CHANGED трансляция, чтобы узнать новый уровень заряда батареи.

0 голосов
/ 08 февраля 2011

Вы не должны помещать логику приложения в метод onReceive (). Этот метод должен обрабатывать только намерение. В противном случае вы, вероятно, заблокируете намеренную доставку в другие приложения.

Состояние вашего аккумулятора не меняется, потому что вы не получаете намерения, пока вы блокируете в этом методе. Само переданное намерение не меняется. Метод onReceive () будет вызываться всякий раз, когда изменяется состояние батареи, если вы не заблокируете ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...