문제

My SensorManager was working perfectly until today. I didn't change any code, all I did was boot eclipse and now I am getting an error which forces my app to quit; here is what I get:

02-20 11:44:50.835: E/AndroidRuntime(23828): FATAL EXCEPTION: main
02-20 11:44:50.835: E/AndroidRuntime(23828): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.synlight_development.sleep_smart/com.synlight_development.sleep_smart.Sleep}: java.lang.NullPointerException
02-20 11:44:50.835: E/AndroidRuntime(23828):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2088)
02-20 11:44:50.835: E/AndroidRuntime(23828):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2113)
02-20 11:44:50.835: E/AndroidRuntime(23828):    at android.app.ActivityThread.access$700(ActivityThread.java:139)
02-20 11:44:50.835: E/AndroidRuntime(23828):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1224)
02-20 11:44:50.835: E/AndroidRuntime(23828):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-20 11:44:50.835: E/AndroidRuntime(23828):    at android.os.Looper.loop(Looper.java:137)
02-20 11:44:50.835: E/AndroidRuntime(23828):    at android.app.ActivityThread.main(ActivityThread.java:4918)
02-20 11:44:50.835: E/AndroidRuntime(23828):    at java.lang.reflect.Method.invokeNative(Native Method)
02-20 11:44:50.835: E/AndroidRuntime(23828):    at java.lang.reflect.Method.invoke(Method.java:511)
02-20 11:44:50.835: E/AndroidRuntime(23828):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
02-20 11:44:50.835: E/AndroidRuntime(23828):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
02-20 11:44:50.835: E/AndroidRuntime(23828):    at dalvik.system.NativeStart.main(Native Method)
02-20 11:44:50.835: E/AndroidRuntime(23828): Caused by: java.lang.NullPointerException
02-20 11:44:50.835: E/AndroidRuntime(23828):    at android.content.ContextWrapper.getSystemService(ContextWrapper.java:423)
02-20 11:44:50.835: E/AndroidRuntime(23828):    at com.synlight_development.sleep_smart.Sleep$Accelerator.<init>(Sleep.java:173)
02-20 11:44:50.835: E/AndroidRuntime(23828):    at com.synlight_development.sleep_smart.Sleep.onCreate(Sleep.java:104)
02-20 11:44:50.835: E/AndroidRuntime(23828):    at android.app.Activity.performCreate(Activity.java:5048)
02-20 11:44:50.835: E/AndroidRuntime(23828):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
02-20 11:44:50.835: E/AndroidRuntime(23828):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2052)
02-20 11:44:50.835: E/AndroidRuntime(23828):    ... 11 more

And here is my sensor class:

public class Accelerator extends Service implements SensorEventListener
    {
        public Accelerator()
        {
            SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
            if(sm.getSensorList(Sensor.TYPE_GYROSCOPE).size() != 0)
            {
                Sensor s = sm.getSensorList(Sensor.TYPE_GYROSCOPE).get(0);
                sm.registerListener(this, s, SensorManager.SENSOR_DELAY_GAME);
            }
        }
        public void onAccuracyChanged(Sensor s, int i) 
        {

        }
}
도움이 되었습니까?

해결책

Move:

SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
if(sm.getSensorList(Sensor.TYPE_GYROSCOPE).size() != 0)
{
    Sensor s = sm.getSensorList(Sensor.TYPE_GYROSCOPE).get(0);
    sm.registerListener(this, s, SensorManager.SENSOR_DELAY_GAME);
}

Into your Service's onCreate(). getSystemService() is a method in Context, which the Service extends. However, you do not have a Context until onCreate() has been called. Therefore, this results in an NPE in the constructor.

Also, make sure you're starting the Service using startService(), and not creating a normal Java object from it

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top