Je veux appeler un Service
dans ma classe qui étend Receiver
BroadcastReceiver
mais le service ne démarre pas et j'eu cette erreur:Exécution d'une IntentService à l'aide BroadcastReceiver AlarmManager
FATAL EXCEPTION: main java.lang.RuntimeException: Unable to
start receiver com.example.ahmed.service.AlarmReceiver:
java.lang.NullPointerException: Attempt to invoke virtual
method 'java.lang.String
android.content.Context.getPackageName()' on a null
object reference
Dans mon MainActivity, j'appelle la gestionnaire d'alarmes:
// Calendar settings for AlarmReceiver
Calendar cur_cal = new GregorianCalendar();
cur_cal.setTimeInMillis(System.currentTimeMillis());//set the current time and date for this calendar
Calendar cal = new GregorianCalendar();
cal.add(Calendar.DAY_OF_YEAR, cur_cal.get(Calendar.DAY_OF_YEAR));
cal.set(Calendar.HOUR_OF_DAY, 8);
cal.set(Calendar.MINUTE, 07);
cal.set(Calendar.SECOND, cur_cal.get(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cur_cal.get(Calendar.MILLISECOND));
cal.set(Calendar.DATE, cur_cal.get(Calendar.DATE));
cal.set(Calendar.MONTH, cur_cal.get(Calendar.MONTH));
// Retrieve a PendingIntent that will perform a broadcast
alarmIntent = new Intent(this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30 * 1000, pendingIntent);
// When you click Start sensing button
public void onSensingButtonClickedToStart(final View view) {
if (!SensorEvent.isSensing) {
SensorEvent.isSensing = true;
manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
int interval = 10000;
manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
Toast.makeText(this, "Sensing On", Toast.LENGTH_SHORT).show();
}
}
// when you click Stop sensing button
public void onSensingButtonClickedToStop(final View view) {
if (SensorEvent.isSensing) {
manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
manager.cancel(pendingIntent);
Toast.makeText(this, "Sensing Off", Toast.LENGTH_SHORT).show();
SensorEvent.isSensing = false;
}
}
Mon service
public class Sense8 extends IntentService {
public static Accelerometer accelerometer;
public static Gyroscope gyroscope;
public static Light light;
public static Magnetometer magnetometer;
Context context;
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
*/
public Sense8(String name) {
super(name);
}
public Sense8(){
super("Sense8");
}
@Override
protected void onHandleIntent(Intent intent) {
Log.d("accelerometer.isSensing", SensorEvent.isSensing + "");
if (accelerometer.isSensing) {
accelerometer = new Accelerometer(context);
gyroscope = new Gyroscope(context);
light = new Light(context);
magnetometer = new Magnetometer(context);
Toast.makeText(context, "I'm running instead of some sensors being captured", Toast.LENGTH_SHORT).show();
Log.d("toast", "I'm running instead of some sensors being captured");
startSensing();
}
}
public static void startSensing() {
accelerometer.start();
gyroscope.start();
light.start();
magnetometer.start();
}
public void stopSensing() {
accelerometer.stop();
gyroscope.stop();
light.stop();
magnetometer.stop();
}
}
Dans ma classe de récepteur, je ne l'appelle IntentService
:
@Override
public void onReceive(Context c, Intent intent) {
Intent service = new Intent(c, Sense8.class);
c.startService(service);
}
Mais en vain, il n'a même pas commencer et m'a frappé directement avec l'erreur ci-dessus
Qu'est-ce que je fais mal? Quelqu'un peut-il m'aider à mettre en œuvre de la bonne façon.
EDIT
les gars m'a donné la bonne solution pour le premier problème, mais maintenant je reçois la même erreur après avoir appuyé sur le bouton de détection
Voici le SensorEvent:
public class SensorEvent implements SensorEventListener {
public static boolean isSensing;
SensorManager mSensorManager;
Sensor mSensor;
DataWriter fileWriter;
Constants.SensorType sensorType;
Context context;
private SensorEvent()
{}
private static SensorEvent INSTANCE = null;
public static SensorEvent getInstance()
{
if (INSTANCE == null)
{ INSTANCE = new SensorEvent();
}
return INSTANCE;
}
public static SensorEvent getInstance(Context context, Constants.SensorType sensorType)
{
if (INSTANCE == null)
{ INSTANCE = new SensorEvent(context, sensorType);
}
return INSTANCE;
}
public SensorEvent(Context context, Constants.SensorType sensorType) {
this.sensorType = sensorType;
this.context = context;
this.mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
this.mSensor = mSensorManager.getDefaultSensor(sensorType.getType());
// this.isSensing = true;
}
public void start() {
isSensing = true;
fileWriter = new DataWriter(sensorType);
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
public void stop() {
try {
fileWriter.finish();
} catch (IOException e) {
e.printStackTrace();
}
isSensing = false;
}
@Override
public void onSensorChanged(android.hardware.SensorEvent event) {
try {
if (isSensing) {
fileWriter.append(event);
} else {
fileWriter.finish();
mSensorManager.unregisterListener(this);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
Dans votre 'BroadcastReceiver', vous utilisez apparemment une référence' Context' nulle que vous avez déclarée en dehors de la méthode 'onReceive()'. Au lieu de cela, utilisez le 'Context' passé dans' onReceive() '. Autrement dit, changez 'context' en' c', sur les deux lignes. –
Copie possible de [Qu'est-ce qu'une exception NullPointerException, et comment la réparer?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it – Sufian