Android: датчик освещенности nullPointerException

В моей деятельности у меня есть один TextView под названием «senzosv». Я хочу, чтобы он показывал текущее значение с моего датчика освещенности. У меня есть следующий код.

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 и сообщение об ошибке: приложение неожиданно закрыто. Я тестирую свое приложение на Samsung Galaxy S II (GT-I9100). Что я сделал не так? Спасибо :)


person Martin Nemeth    schedule 10.03.2013    source источник


Ответы (3)


сделай это

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

после setContentView()

person DjHacktorReborn    schedule 10.03.2013
comment
Спасибо. Теперь это работает хорошо. У меня есть еще один вопрос. Датчик освещенности может возвращать только значения 1000, 100 и 10? Или можно точнее? Спасибо - person Martin Nemeth; 10.03.2013

Вы можете использовать findViewById только после того, как у вас есть setContentView.

то есть переместите его в onCreate после setContentView

TextView tv;

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

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

}

Если вы прочитаете свой LogCat немного внимательнее, он объяснит, какая строка вашего кода вызывает NullPointer, и вам будет легче ее отлаживать.


Вам также потребуются разрешения в вашем манифесте для использования датчика.

person Blundell    schedule 10.03.2013
comment
Есть ли способ сделать мой датчик освещенности более точным? Он показывает только 10, 100 или 1000 значений. - person Martin Nemeth; 10.03.2013

Вы должны вызвать setContentView(R.layout.layout_main);, потому что он устанавливает макет активности, а затем получает ссылку на текстовое представление.

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();
person Ajay S    schedule 10.03.2013
comment
Спасибо, но где именно я должен разместить этот код, если я хочу прочитать это значение в реальном времени? - person Martin Nemeth; 11.03.2013