2016-06-25 1 views
0

Je veux appeler un Service dans ma classe qui étend ReceiverBroadcastReceiver 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) { 

    } 


} 
+1

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. –

+0

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

Répondre

0

il suffit de changer:

@Override 
    public void onReceive(Context c, Intent intent) { 


     Intent service = new Intent(context, Sense8.class); 
     context.startService(service); 
} 

à

@Override 
    public void onReceive(Context c, Intent intent) { 


     Intent service = new Intent(c, Sense8.class); 
     c.startService(service); 
} 

Vous vous n'êtes pas affecté context au paramètre c. Vous essayez donc de démarrer le service sur une référence nulle.

+0

Oui en effet, erreur stupide je suis désolé. Maintenant, l'application s'ouvre, mais après avoir appuyé sur le bouton ** onSensingButtonClickedToStart ** je reçois, l'application commence à détecter et je ne reçois pas le toast suivant 'Toast.makeText (contexte," Je cours au lieu de certains capteurs étant capturé ", Toast.LENGTH_SHORT) .show();' Si vous me le permettez, je vais éditer ma question et vous fournir le bon cours. Mon but est de capturer des données de capteur dans des intervalles donnés et j'essaye d'implémenter le IntentService parce que quelqu'un ici sur StackOverflow a dit que ceci permet d'exécuter un service même si l'application est fermée –

+0

@ahmedhamed Je ne peux pas savoir ce que vous avez écrit ici jusqu'à ce que vous l'expliquiez bien. Une question n'obtiendra pas de réponse ici jusqu'à ce qu'elle échoue, vous comprenez ce qui se passe aux autres. Je pense que cela a du sens. Donnez une explication correcte de ce que vous faites, pourquoi et quelle erreur vous avez - avec des chemins de pile complets et des journaux. –

+0

Vous avez raison, d'accord, j'ai une application qui recueille des capteurs, les écrivent sur la carte SD puis les envoyer via FTP. L'application utilise le gestionnaire d'alarme et le gestionnaire de capteurs et toutes les classes adéquates, cela fonctionne bien et génère un fichier toutes les 10 ou 20 secondes comme spécifié dans l'intervalle.le problème est avec le cycle de vie de l'activité, quand je pousse le bouton de la maison il continue à fonctionner c'est bien, mais quand je ferme l'application, il cesse de recueillir des données. C'est pourquoi j'ai dû implémenter le IntentService mais maintenant, une fois que j'appuie sur le bouton d'envoi de départ, il reste quelques secondes puis j'obtiens le ** l'application s'est arrêtée ** –