Как получить конкретные значения датчика освещенности

Я только начал изучать Android. Я разработал программу под названием Android Light Sensor, которая измеряет интенсивность света. Вот мой код:

    package com.AndroidLightSensor;

import com.example.andriodlightsensor.R;

import android.os.Bundle;
import android.app.Activity;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class AndriodLightSensorActivity extends Activity {

    ProgressBar lightMeter;
     TextView textMax, textReading;
     float counter;
     Button read;
     TextView display;

        /** Called when the activity is first created. */

     @Override
        public void onCreate(Bundle savedInstanceState) {
         counter = 0;
         read = (Button) findViewById(R.id.bStart);
         display = (TextView) findViewById(R.id.tvDisplay);

            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            lightMeter = (ProgressBar)findViewById(R.id.lightmeter);
            textMax = (TextView)findViewById(R.id.max);
            textReading = (TextView)findViewById(R.id.reading);

            SensorManager sensorManager 
            = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
            Sensor lightSensor 
            = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

            if (lightSensor == null){
             Toast.makeText(AndriodLightSensorActivity.this, 
               "No Light Sensor! quit-", 
               Toast.LENGTH_LONG).show();
            }else{
             float max =  lightSensor.getMaximumRange();
             lightMeter.setMax((int)max);
             textMax.setText("Max Reading(Lux): " + String.valueOf(max));

             sensorManager.registerListener(lightSensorEventListener, 
               lightSensor, 
               SensorManager.SENSOR_DELAY_NORMAL);

            }
        }

     SensorEventListener lightSensorEventListener
        = new SensorEventListener(){

      @Override
      public void onAccuracyChanged(Sensor sensor, int accuracy) {
       // TODO Auto-generated method stub

      }

      @Override
      public void onSensorChanged(SensorEvent event) {
       // TODO Auto-generated method stub
       if(event.sensor.getType()==Sensor.TYPE_LIGHT){
        final float currentReading = event.values[0];
        lightMeter.setProgress((int)currentReading);
        textReading.setText("Current Reading(Lux): " + String.valueOf(currentReading));
        read.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                display.setText("" + String.valueOf(currentReading));
            }
        });

       }
      }

        };
    }

Также XML это:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tvDisplay"

    />
<ProgressBar
    android:id="@+id/lightmeter"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="80dp"
    style="?android:attr/progressBarStyleHorizontal"
    android:max="100"
    android:progress="0"
    />
<TextView 
    android:id="@+id/max"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"    
    />
<TextView 
    android:id="@+id/reading"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 

    />
<Button 
    android:layout_width="250dp" 
    android:layout_height="wrap_content"
    android:text="Start"  
    android:layout_y="249dp"  
    android:textSize="30dp"
    android:onClick="onButtonDown"
    android:id="@+id/bStart" 
    ></Button>

</LinearLayout>

Я хочу получить текущее значение всякий раз, когда я нажимаю кнопку; i: e значение не должно продолжать изменяться (как в секундомере, но обновленное должно заменить предыдущее). В Eclipse он не показывает ошибок, но когда я запускаю на своем устройстве, говорит: "К сожалению, Android Light Sensor остановился". Пожалуйста помоги!!

1 ответ

Решение

Есть ошибка, которая очевидна.
Если findViewById используется раньше setContentView(R.layout.main); возвращаемые значения равны нулю.
Когда вы пытаетесь использовать их, вы получаете ошибку.

Поместите эти две строки после setContentView(R.layout.main);

read = (Button) findViewById(R.id.bStart);
display = (TextView) findViewById(R.id.tvDisplay);
Другие вопросы по тегам