2013-03-10 97 views
1

在我的活动中,我有一个名为“senzosv”的TextView。我希望它能显示我的光线传感器的当前值。我有以下代码。android:光传感器nullPointerException

public class Osvetlenie extends Activity implements OnItemSelectedListener, OnSeekBarChangeListener, SensorEventListener { 


SensorManager sm; 
Sensor proxSensor; 
Sensor lighhtSens; 
TextView tv = (TextView)findViewById(R.id.senzosv); 

这是我的onCreate:

... 
sm = (SensorManager) getSystemService(SENSOR_SERVICE); 
    proxSensor =sm.getDefaultSensor(Sensor.TYPE_PROXIMITY); 
    lighhtSens = sm.getDefaultSensor(Sensor.TYPE_LIGHT); 
    sm.registerListener(this, proxSensor, SensorManager.SENSOR_DELAY_NORMAL); 
    sm.registerListener(this, lighhtSens, SensorManager.SENSOR_DELAY_NORMAL); 

这里有方法onSensorChanged和onAccuracyChanged

public void onSensorChanged(SensorEvent event) 
{ 
if(event.sensor.getType() == Sensor.TYPE_LIGHT) 
    { 
    tv.setText("value: " + event.values[0] + " lux"); 
    Toast.makeText(getApplicationContext(),"On SensorChanged"+ event.values[0],Toast.LENGTH_SHORT).show(); 

    } 

} 

public void onAccuracyChanged(Sensor sensor, int accuracy) { 

    Log.d(ACCESSIBILITY_SERVICE,"onAccuracyChanged: " + sensor + ", accuracy: " + accuracy); 
    if(sensor.getType() == Sensor.TYPE_LIGHT){ 
     Log.i("Sensor Changed", "Accuracy :" + accuracy); 
     } 

} 

当我运行我的应用程序,当我试图启动这一活动, LogCat中出现nullpointexception,错误消息:应用程序意外关闭 我在Samsung Galaxy S II(GT-I9100)上测试我的应用程序 我错了什么?谢谢:)

回答

0

做到这一点

tv = (TextView)findViewById(R.id.senzosv); 

setContentView()

+0

谢谢。它现在运作良好。我还有一个问题。光线传感器能够仅返回值1000,100和10吗?或者它可以更准确吗?谢谢 – 2013-03-10 11:03:34

+0

如果这解决了你的问题接受回答 – DjHacktorReborn 2013-03-10 11:04:22

0

必须调用setContentView(R.layout.layout_main);因为它的设置,则活动布局得到TextView的参考。

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.layout_main); 
    tv = (TextView)findViewById(R.id.senzosv); 
} 

是光传感器能够只返回值1000,100和10?

直接从系统设备文件

Scanner st = new Scanner(new File("/sys/devices/virtual/lightsensor/switch_cmd/lightsensor_file_state")); 
int lux = st.nextInt(); 
st.close(); 
+0

谢谢,但是如果我想要实时读取该值,我应该在哪里放这个代码? – 2013-03-10 21:49:43

+0

@MartinNemeth你可以把它放在服务中... – 2013-03-11 04:36:31

0

您只能使用findViewById你有setContentView后得到的值。

即它移动到onCreatesetContentView

TextView tv; 

public void onCreate(Bundle b){ 
    super.onCreate(b); 
    setContentView(R.layout.activity_main); 

    tv = (TextView) findViewById(R.id.senzosv); 

} 

如果你读你的logcat多一点小心地将解释什么行代码是导致空指针,你可以调试更方便。


您还需要清单中的权限才能使用传感器。

+0

有没有一种方法可以让我的光线传感器更精确?它只显示10,100或1000个值。 – 2013-03-10 11:30:34