Исключение нулевого указателя при вызове getSystemService для класса Service - PullRequest
1 голос
/ 28 октября 2019

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

    Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference.

Ошибка не возникает, если я пытаюсь получить диспетчер датчиков в классе активности, это происходит только в сервисекласс.

Это мой основной класс деятельности:

    public class MainActivity extends AppCompatActivity
    {
        GridLayout mainGrid;

        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            Intent intent = new Intent(MainActivity.this, accelerometerBackgroundService.class);
            startService(intent);

            mainGrid = (GridLayout) findViewById(R.id.mainGrid);


            //Set Event
            setSingleEvent(mainGrid);
    //        setToggleEvent(mainGrid);
        }
    ...
     }

Это мой класс обслуживания:

    public class accelerometerBackgroundService extends Service implements SensorEventListener
    {
        //We need to log our activity to check what happens
        private static final String TAG = "Accelerometer_Activity";
        private SensorManager mSensorManager; //defining a sensor manager and the accelerometer
        private Sensor accelerometer;


        public accelerometerBackgroundService()
        {
            Log.i(TAG, "GOT HERE 100");
            //getting the sensor manager services
            mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

            //getting the accelerometer sensor
            accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            if(accelerometer != null)
            {
                //If accelerometer sensor is available, create a listener
                mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
            }
            else
            {
                String noAccelError = "This device does not support accelerometer sensor!";
            }
        }
        ...
        }

Я думаю, это связано с контекстом. Я искал похожие вопросы, но не помог мне.

Спасибо.

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Поскольку Service является подклассом ContextWrapper, который, в свою очередь, является подклассом Context, вам не нужно передавать Context в конструктор вашего AccelerometerBackgroundService.

Но вы можете воспользоваться этим отношением только после выполнения кода конструктора. Так что если вы вызываете метод Context getSystemService(), например, в onCreate(), то все должно работать как нужно.

1 голос
/ 28 октября 2019

Вы должны переместить свой код инициализации в Service#onCreate(), а не в его конструктор.

Итак, переопределите метод onCreate() из Service, и вы сможете получить доступ к его Context.

Кроме того, поскольку для платформы Android требуется пустой конструктор Service, НЕ следует передавать параметры в конструктор Service, в противном случае можно выдать java.lang.InstantiationException.

...