2016-06-25 7 views
0

Я хочу назвать Service в моем Receiver классе, который проходит BroadcastReceiver но служба не началась, и я получил эту ошибку:Запуск IntentService в 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 

В моей MainActivity, я называю сигнализации менеджер:

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

Моя служба

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

    } 
} 

В моем классе Receiver, я только называю IntentService:

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


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

Но напрасно, это не даже начать и ударил меня прямо с вышеуказанной ошибкой

Что я делаю неправильно? Может кто-то помочь мне реализовать это правильно.

EDIT

ребята дали мне правильное решение для первой проблемы, но теперь я получаю ту же ошибку, после нажатия на кнопку зондирования

Вот 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

В вашем «BroadcastReceiver» вы, по-видимому, используете нулевую ссылку «Контекст», которую вы объявили вне метода 'onReceive()». Вместо этого используйте 'Context', переданный в' onReceive() '. То есть, измените 'context' на' c', на обе строки. –

+0

Возможный дубликат [Что такое исключение NullPointerException и как его исправить?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – Sufian

ответ

0

только что изменил:

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

Вы не назначили вам context параметру c. Таким образом, вы пытаетесь запустить сервис с нулевой ссылкой.

+0

Да, действительно, глупая ошибка, я сожалею. теперь приложение открывается, но после того, как я нажму кнопку ** onSensingButtonClickedToStart **, я получаю, приложение начинает считывать, и я не получаю следующий тост. 'Toast.makeText (контекст:« Я запускаю вместо некоторых датчиков, capture ", Toast.LENGTH_SHORT) .show();' Если вы позволите мне, я отредактирую свой вопрос и предоставит вам подходящий класс. Моя цель - захватить данные датчиков за определенные промежутки времени, и я пытаюсь реализовать IntentService, потому что кто-то здесь, в StackOverflow, сказал, что это позволяет запускать службу, даже если приложение закрыто. –

+0

@ahmedhamed Я не знаю, что вы написали здесь, пока вы не объясните это красиво. Вопрос не получит ответа здесь до тех пор, пока это не поможет вам понять, что происходит с другими. Я думаю, это имеет смысл. Поставьте правильное объяснение того, что вы делаете, почему и какая ошибка вы получили - с полным стеком и журналами. –

+0

Вы правы, хорошо, у меня есть приложение, которое собирает датчики, записывает их на SD-карту, а затем отправляет их через FTP. Приложение использует диспетчер аварийных сигналов и диспетчер датчиков и все соответствующие классы, он отлично работает и генерирует файл каждые 10 или 20 секунд, как указано в интервале.проблема связана с жизненным циклом активности, когда я нажимаю кнопку «домой», она продолжает работать, это нормально, но когда я закрываю приложение, он перестает собирать данные. Вот почему я должен был реализовать IntentService, но теперь, когда я нажимаю кнопку отправки, он остается на пару секунд, после чего я получаю ** приложение остановлено ** –

Смежные вопросы