1

バッテリーの状態に BroadcastReceiver を使用しようとしていますが、そのレベルが 20% 未満で充電されていないときに何かを実行しようとしています。問題は、バッテリーが 20% になると機能しないことです。

これがコードです。誰かが私を助けてくれることを願っています:

public class BatteryStateReceiver extends Activity {
    AccionesExecuter Ejecutor = new AccionesExecuter();
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
        this.registerReceiver(this.batteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    }

    private BroadcastReceiver batteryInfoReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context contexto, Intent intent) {
            Log.e("ReceiverBatería", "Recibió");
            int  level= intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);
            int  plugged= intent.getIntExtra(BatteryManager.EXTRA_PLUGGED,0);

            if(level <= 20 && plugged == 0)
            {
                Log.e("If", "Entró");
                Action ac = new Action(0, 0, 0, false);
                //ACTIONS
                ActionsSQLite base = new ActionsSQLite(contexto, "Actions", null,1);
                SQLiteDatabase db1 = base.getReadableDatabase();
                db1 = contexto.openOrCreateDatabase("Actions",SQLiteDatabase.OPEN_READONLY, null);

                String query = "SELECT * FROM Actions WHERE IdEvento = 2";
                Cursor c1 = db1.rawQuery(query, null);

                try{
                    if(c1!=null){

                        int i = c1.getColumnIndexOrThrow("Id");
                        int j = c1.getColumnIndexOrThrow("IdAccion");
                        int k = c1.getColumnIndexOrThrow("IdEvento");
                        int l = c1.getColumnIndexOrThrow("Activa");
                        boolean esActiva;

                        //Nos aseguramos de que existe al menos un registro
                        while(c1.moveToNext()){
                            if (c1.getInt(l) == 0){
                                esActiva = false;
                            } else
                            {
                                esActiva = true;
                            }
                            //Recorremos el cursor hasta que no haya más registros
                            ac = new Action(c1.getInt(i), c1.getInt(j), c1.getInt(k), esActiva);
                            if (esActiva == true){ //Si está activa, la ejecuta, sino no
                            Ejecutor.execute(contexto, ac.getIdAccion());
                            Log.e("Action ejecutada, Id: ", String.valueOf(ac.getId()));
                            }
                        }
                    }
                    else 
                        Toast.makeText(contexto, 
                                  "No hay nada :(", Toast.LENGTH_LONG).show();
                  }
                  catch (Exception e){
                    Log.i("bdActions", "Error al abrir o crear la base de datos" + e); 
                  }

                  if(db1!=null){
                        db1.close();
                }   
            }


        }
    };


}
4

3 に答える 3

0

ブロードキャストという名前のブロードキャスト クラスを作成します。

public class broadcast extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        Toast.makeText(context, "Broadcast recieved", Toast.LENGTH_LONG).show();

    }
}

マニフェストファイルに追加してください

<receiver android:name="com.example.baterry.broadcast" >
            <intent-filter>
                <action android:name="android.intent.action.BATTERY_LOW" >
                </action>
            </intent-filter>

うまくいけば、それはあなたの要件に完全に対応します.

于 2014-12-19T05:50:28.303 に答える
0

BatteryManager API ドキュメントによるとEXTRA_LEVEL、整数値のように見えますが、必ずしもパーセンテージを表すわけではありません。代わりに、EXTRA_SCALE可能な最大値である に相対的です。

20 のようなハードコードされたマジック ナンバーと比較することはできません。パーセンテージに変換するには、自分で計算する必要があります。

int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 1);
int percent_level = (level * 100) / scale;
于 2014-12-19T05:35:12.137 に答える
0

ドキュメントはそれをかなりきちんと説明しています。プログラムでブロードキャストに登録するのではなく、マニフェストでバッテリーの更新を直接登録してみてください。

http://developer.android.com/training/monitoring-device-state/battery-monitoring.html#MonitorLevel

注: 現在、特定のバッテリー レベルを登録する方法はありません。たとえば、アンドロイドはいつ「android.intent.action.ACTION_BATTERY_LOW」をブロードキャストするかを決定しますが、これは温度や電話によって異なる場合があります...

さまざまなインテントに登録してから、http: //developer.android.com/training/monitoring-device-state/battery-monitoring.html#CurrentLevelを使用して正確なバッテリー レベルを判断できます。

また、「いい」開発者になるためには、必要なバッテリー インテントを修正してみてください。携帯電話のスリープを頻繁に解除するとバッテリーが消費され、ユーザーはこれを高く評価しません。

最後に:

そこにいくつかの SQL コードがあることに気付きました。これは、ブロードキャスト レシーバーにウェイク ロックがない限り、おそらく完了しない可能性があります。

于 2014-12-19T05:55:45.170 に答える