Вещательный приемник для батареи не работает
Я пытаюсь использовать 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();
}
}
}
};
}
3 ответа
Создайте класс Broadcast с именем Broadcast
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>
Надеюсь, это будет работать идеально для вашего требования.
Согласно документам 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;
Документы объясняют это довольно прилично. Попробуйте зарегистрироваться для получения обновлений батареи непосредственно в манифесте, а не для программной трансляции.
http://developer.android.com/training/monitoring-device-state/battery-monitoring.html
Примечание: в настоящее время нет способа зарегистрироваться для определенного уровня заряда батареи. Например, Android определяет, когда транслировать "android.intent.action.ACTION_BATTERY_LOW", и это может отличаться в зависимости от температуры, телефона...
Вы можете зарегистрироваться для разных целей и затем определить точный уровень заряда батареи, используя: http://developer.android.com/training/monitoring-device-state/battery-monitoring.html
Также, чтобы быть "хорошим" разработчиком, попробуйте и уточните, какая батарея вам нужна. Слишком частое пробуждение телефона расходует заряд батареи, и пользователи не оценят это.
И,наконец:
Заметил, что у вас есть некоторый код SQL там. Скорее всего, это может не завершиться, если в Broadcast Receiver нет блокировки пробуждения.