android - 无法读取 Android 中的传感器

标签 android android-sensors sensormanager

我有一个应用程序,我想将传感器数据合并到其中。我的第一步是创建一个仅读取传感器数据并将其显示在屏幕上的应用程序。我所做的大部分研究都指向诸如 Lars Vogel's 之类的教程。 。不幸的是,这就是我被困住的地方。我基本上把他的代码复制粘贴到我的项目中,尽管应用程序运行了,但它不显示任何数据。

这是我正在使用的代码:

package com.example.sensortest;    

import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

public class sensortest extends Activity implements SensorEventListener{
    private SensorManager mSensorManager;
    private Sensor mSensor;
    RelativeLayout rlsensortest; 
    TextView tvOutput;
    Button btnStart, btnStop;
    Boolean blnScan=false;

    private Handler mHandler = new Handler();
    private long mStartTime=0L;
    private long lElapsedTime=0;

    private boolean color = false;
    private long lastUpdate;        

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        //mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);       

        LayoutInflater layoutInflater = this.getLayoutInflater();

        rlsensortest = (RelativeLayout) layoutInflater.inflate(R.layout.activity_asphalt_alert,null);       
        tvOutput = (TextView) rlsensortest.findViewById(R.id.txtOutput);        
        tvOutput.setText("Initialized...\n");

        btnStart = (Button) rlsensortest.findViewById(R.id.btnStart);
        btnStop = (Button) rlsensortest.findViewById(R.id.btnStop);

        btnStart.setOnClickListener(mButtonListener);
        btnStop.setOnClickListener(mButtonListener);

        lastUpdate = System.currentTimeMillis();

        setContentView(rlsensortest);        
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_asphalt_alert, menu);
        return true;
    }
    // Create an anonymous implementation of OnClickListener
    private OnClickListener mButtonListener = new OnClickListener() {
        String strMessage ="";
        public void onClick(View v) {
            if (v == btnStart){
                strMessage = "Starting sensor scan.";
                blnScan=true;
            //  mStartTimer();

            } else if (v == btnStop){
                strMessage = "Stoping sensor scan.";
                blnScan=false;
            //  mStopTimer();
            }
            if (strMessage != "")
                Toast.makeText(rlsensortest.getContext(), strMessage, Toast.LENGTH_SHORT).show();

            strMessage = "";
        }
    };



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

    }

    @Override
    public void onSensorChanged(SensorEvent event) {
/*      String strEvent = "";
        strEvent = "this is a test";
        tvOutput.setText(tvOutput.getText() + strEvent + "Another line\n"); */

        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            getAccelerometer(event);
        }       

    }
    private void getAccelerometer(SensorEvent event) {
        float[] values = event.values;
        // Movement
        float x = values[0];
        float y = values[1];
        float z = values[2];

        float accelationSquareRoot = (x * x + y * y + z * z)
            / (SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH);
        long actualTime = System.currentTimeMillis();
        if (accelationSquareRoot >= 2) //
        {
          if (actualTime - lastUpdate < 200) {
            return;
          }
          lastUpdate = actualTime;
          Toast.makeText(this, "Device was shuffed", Toast.LENGTH_SHORT)
              .show();
          if (color) {
            tvOutput.setBackgroundColor(Color.GREEN);

          } else {
            tvOutput.setBackgroundColor(Color.RED);
          }
          color = !color;
        }
      } 
}

此时,当手机摇晃时,它应该(至少)发出一个提示,表明事件发生了。知道我做错了什么吗?感谢任何帮助

最佳答案

看起来您从未使用 mSensorManager 执行任何操作。您需要从中获取 Sensor,然后才能接收 SensorEventListener 回调。获取/释放Sensor通常发生在onResume/onPause中。

示例来自Lars Vogel's Sensor tutorial :

  @Override
  protected void onResume() {
    super.onResume();
    // register this class as a listener for the orientation and
    // accelerometer sensors
    mSensorManager.registerListener(this,
        mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
        SensorManager.SENSOR_DELAY_NORMAL);
  }

  @Override
  protected void onPause() {
    // unregister listener
    super.onPause();
    mSensorManager.unregisterListener(this);
  }

关于android - 无法读取 Android 中的传感器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12215081/

相关文章:

android - 获取传感器 event.values.length()(无需等待 onSensorChanged())

java - 使用 jsoup 从具有可变页面数据的 'form' 类中提取文本

android - 评估项目 ':react-native-reanimated' 时出现问题

android - 如何获取在 TextView 中单击的文本行

LogCat 中的 Android SensorManager 错误

android - Android(虚拟)传感器的用电量

java - 二进制 XML 文件行 #27 : Error inflating class androidx. appcompat.widget.ActionBarContainer?

java - Nexus 6P 上硬件传感器的 Android 采样率变化

android - Galaxy s3 有温度传感器吗?