2016-11-21 79 views
-2

我正在创建一个简单的Android类,用一些特定的传感器最新的值更新一个变量(Light,temp和更多),我通过getData()方法访问它(传感器值),但是出现错误。我希望你能帮助我!错误java.lang.NullPointerException:试图调用虚拟方法'java.lang.Object android.content.Context.getSystemService

这是我的通用传感器类。

MySensor

public class mySensor extends Service implements SensorEventListener { 

private SensorManager mSensorManager =null; 
private Sensor s=null; 

float data = 0; 


public void onCreate(){ 
    super.onCreate(); 
    mSensorManager= (SensorManager) getSystemService(Context.SENSOR_SERVICE); 


} 


public mySensor(int type){ 

    //HERE I'M GETTING THE ERROR 
    s= mSensorManager.getDefaultSensor(type); 




} 

public String getData(){ 

    return String.valueOf(data); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() == Sensor.TYPE_LIGHT) { 
     data = event.values[0]; 
    } 

} 

@Override 
public void onAccuracyChanged(Sensor sensor, int i) { 

} 
protected void onResume() { 

    mSensorManager.registerListener((SensorEventListener) this, s, SensorManager.SENSOR_DELAY_NORMAL); 


} 

protected void onPause() { 
    // super.onPause(); 
    mSensorManager.unregisterListener((SensorEventListener) this); 
} 
} 

这里是日志

... 
E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: project.luke.com.sensorreader, PID: 25297 
        java.lang.RuntimeException: Unable to start activity ComponentInfo{project.luke.com.sensorreader/project.luke.com.sensorreader.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.hardware.Sensor android.hardware.SensorManager.getDefaultSensor(int)' on a null object reference 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2460) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2522) 
         at android.app.ActivityThread.access$800(ActivityThread.java:169) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421) 
         at android.os.Handler.dispatchMessage(Handler.java:111) 
         at android.os.Looper.loop(Looper.java:194) 
         at android.app.ActivityThread.main(ActivityThread.java:5546) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at java.lang.reflect.Method.invoke(Method.java:372) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:967) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762) 
        Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.hardware.Sensor android.hardware.SensorManager.getDefaultSensor(int)' on a null object reference 
         at project.luke.com.sensorreader.mySensor.<init>(mySensor.java:39) 
         at project.luke.com.sensorreader.MainActivity.onCreate(MainActivity.java:32) 
         at android.app.Activity.performCreate(Activity.java:5975) 
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111) 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2413) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2522)  
         at android.app.ActivityThread.access$800(ActivityThread.java:169)  
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)  
         at android.os.Handler.dispatchMessage(Handler.java:111)  
         at android.os.Looper.loop(Looper.java:194)  
         at android.app.ActivityThread.main(ActivityThread.java:5546)  
         at java.lang.reflect.Method.invoke(Native Method)  
         at java.lang.reflect.Method.invoke(Method.java:372)  
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:967)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)  

在我的MainActivity类别我简单的调用mLight =新mySensor(Sensor.TYPE_LIGHT);但是这会触发错误,导致mSensorManager = null,始终。

+2

可能重复[什么是NullPointerException,以及如何解决它?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-doi-i-fix -it) –

+0

请勿创建“Service”的随机子类并通过某个构造函数使用它。最有可能的是,不需要使用“服务” - 将此逻辑移入现有的“活动”中。即使你确实需要一个'Service',你也需要正确使用它(例如'startService()'),而不是自己创建一个实例。 – CommonsWare

+0

@Simze问题不在于“什么是NPE?”但是“为什么我在初始化它之后得到* this * NPE? – Sam

回答

0

从您的MainActivity:

Intent intent = new Intent(this, mySensor.class); 
intent.putExtra("type", Sensor.TYPE_LIGHT); 

和您的服务中:

@Override 
public IBinder onBind(Intent intent) { 
    mSensorManager= (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    int type = intent.getExtras().get("type"); 
    s= mSensorManager.getDefaultSensor(type); 
    return null; 
} 

,那么你可以删除:

public mySensor(int type){ 
    ... 
} 

,最终你onCreate内写的代码。

+0

@Londrake有意义吗? – Lino

相关问题