如何获取光传感器的特定值

时间:2013-12-16 11:06:03

标签: android sensor light

我刚刚开始学习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值不应该一直在变化(如在Stop Watch中,但更新后应该替换前一个)。在Eclipse中,它没有显示错误,但是当我在我的设备上运行时说“不幸的是,Android光传感器已停止”。 请帮忙!!

1 个答案:

答案 0 :(得分:3)

有一个明显的错误 如果在findViewById之前使用setContentView(R.layout.main);,则返回的值为空 当您尝试使用它们时,您会收到错误消息。

将这两行放在setContentView(R.layout.main);

之后
read = (Button) findViewById(R.id.bStart);
display = (TextView) findViewById(R.id.tvDisplay);