当前位置: 首页 > 知识库问答 >
问题:

将Android运动传感器设置为数组并显示值[重复]

顾乐池
2023-03-14

我在寻求帮助。我上过Android编程课,我们需要构建一个应用程序,将传感器数据(加速度计、陀螺仪和磁场)放入数组中,并显示值。不幸的是,我只知道基本的Java,我觉得有些逻辑卡住了。

我通过显示传感器的实时值启动了我的应用程序。我能做到,但太吵了,不准确。因此,我试图将传感器生成的值存储到一个数组中,然后在文本视图中显示这些值。现在,当我运行应用程序时,它只会崩溃。我不确定我遗漏了什么,但可能是一些Java逻辑。总之,我已经正确设置了UI。我有主要的活动。java和单独的java类来收集使用getter和setter设置的传感器数据。

Mainactive代码:

package com.example.servicesassignmentone;

import androidx.appcompat.app.AppCompatActivity;

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.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements SensorEventListener{
    private Button myButton;
    Handler myHandler = new Handler();

    private TextView accelerometerX, accelerometerY, accelerometerZ;
    private SensorManager sensorManager;
    private Sensor sensorAccelerometer;
    private boolean sensorAccelerometerSet = false;
    private List<Accelerometer> accelerometerListValues = new ArrayList<Accelerometer>();

    private TextView gyroscopeX, gyroscopeY, gyroscopeZ;
    private Sensor sensorGyroscope;
    private boolean sensorGyroscopeSet = false;
    private List<Gyroscope> gyroscopeLastValues = new ArrayList<Gyroscope>();

    private TextView magFieldX, magFieldY, magFieldZ;
    private Sensor sensorMagField;
    private boolean sensorMagFieldSet = false;
    private List<MagField> magFieldLastValues = new ArrayList<MagField>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // button and UI initialization
        myButton = (Button) findViewById(R.id.myButton);
        //Accelerometer
        accelerometerX = (TextView) findViewById(R.id.textViewAccX);
        accelerometerY = (TextView) findViewById(R.id.textViewAccY);
        accelerometerZ = (TextView) findViewById(R.id.textViewAccZ);
        //Gyroscope
        gyroscopeX = (TextView) findViewById(R.id.textViewGyroX);
        gyroscopeY = (TextView) findViewById(R.id.textViewGyroY);
        gyroscopeZ = (TextView) findViewById(R.id.textViewGyroZ);
        //Magnetic Field
        magFieldX = (TextView) findViewById(R.id.textViewMagX);
        magFieldY = (TextView) findViewById(R.id.textViewMagY);
        magFieldZ = (TextView) findViewById(R.id.textViewMagZ);

        // initializing the sensor manager
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        // initializing the different sensors
        sensorAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorGyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
        sensorMagField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

        myButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                switch (view.getId()){
                    case R.id.myButton:
                    sensorManager.registerListener((SensorEventListener) MainActivity.this, sensorAccelerometer, SensorManager.SENSOR_DELAY_FASTEST);
                    sensorManager.registerListener((SensorEventListener) MainActivity.this, sensorGyroscope, SensorManager.SENSOR_DELAY_FASTEST);
                    sensorManager.registerListener((SensorEventListener) MainActivity.this, sensorMagField, SensorManager.SENSOR_DELAY_FASTEST);
                    break;
                }
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        sensorAccelerometerSet = false;
        sensorGyroscopeSet = false;
        sensorMagFieldSet = false;
        sensorManager.registerListener((SensorEventListener) this, sensorAccelerometer, SensorManager.SENSOR_DELAY_FASTEST);
        sensorManager.registerListener((SensorEventListener) this, sensorGyroscope, SensorManager.SENSOR_DELAY_FASTEST);
        sensorManager.registerListener((SensorEventListener) this, sensorMagField, SensorManager.SENSOR_DELAY_FASTEST);

    }

    @Override
    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener((SensorEventListener) this);
    }


    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {

        //Using the arraylist
        Float accelerValuesX, accelerValuesY, accelerValuesZ;
        Float gyroValuesX, gyroValuesY, gyroValuesZ;
        Float magValuesX, magValuesY, magValuesZ;

       //if (accelerometerListValues.size() >= 500 && gyroscopeLastValues.size() >= 500 && magFieldLastValues.size() >= 500) {
       //}

        if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            accelerValuesX = sensorEvent.values[0];
            accelerValuesY = sensorEvent.values[1];
            accelerValuesZ = sensorEvent.values[2];
          accelerometerListValues.add(new Accelerometer(accelerValuesX, accelerValuesY, accelerValuesZ));
          for (int i = 0; i < accelerometerListValues.size(); i++) {
              Accelerometer output = accelerometerListValues.get(i);
              accelerometerX.setText((CharSequence) output);
          }
            }
        if (sensorEvent.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
            gyroValuesX = sensorEvent.values[0];
            gyroValuesY = sensorEvent.values[1];
            gyroValuesZ = sensorEvent.values[2];
            gyroscopeLastValues.add(new Gyroscope(gyroValuesX, gyroValuesY, gyroValuesZ));
            for (int i = 0; i < gyroscopeLastValues.size(); i++) {
                 Gyroscope output = gyroscopeLastValues.get(i);
                gyroscopeX.setText((CharSequence) output);
            }
        }
        if (sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
            magValuesX = sensorEvent.values[0];
            magValuesY = sensorEvent.values[1];
            magValuesZ = sensorEvent.values[2];
            magFieldLastValues.add(new MagField(magValuesX, magValuesY, magValuesZ));
            for (int i = 0; i < magFieldLastValues.size(); i++) {
                MagField output = magFieldLastValues.get(i);
                magFieldX.setText((CharSequence) output);
            }
        }

共有1个答案

缪宪
2023-03-14

从您提供的调试日志

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.servicesassignmentone, PID: 28780 java.lang.ClassCastException: com.example.servicesassignmentone.Accelerometer cannot be cast to java.lang.CharSequence

问题发生在MainActivity.java:120(第120行)

for (int i = 0; i < accelerometerListValues.size(); i++) {
    Accelerometer output = accelerometerListValues.get(i);
    accelerometerX.setText((CharSequence) output); // Program crash at this line
}

变量输出是一个加速计,但您要将其转换为字符序列。我不知道该怎么做。实例服务SignmentOne。加速计看起来好像没有显示代码,但我相信可能有一种方法可以让您访问它的值。

 类似资料:
  • 运动传感器包含一个 3轴陀螺仪 以及一个 3轴加速度计 ,具备能够检测物体的运动姿态,加速度,以及震动强度。 坐标轴及角度方向定义 坐标轴 角度英文名 角度中文名 角度范围 X Pitch 俯仰角 -180~180° Y Roll 翻滚角 -90~90° Z Yaw 偏航角 -180~180° 原理介绍 如果你在互联网上直接搜索陀螺仪,你将很可能得到如下图片: 这是一种基于角动量守恒的理论,用来感

  • 运动传感器包含一个 3轴陀螺仪 以及一个 3轴加速度计 ,具备能够检测物体的运动姿态,加速度,以及震动强度。 坐标轴及角度方向定义 坐标轴 角度英文名 角度中文名 角度范围 X Pitch 俯仰角 -180~180° Y Roll 翻滚角 -90~90° Z Yaw 偏航角 -180~180° 原理介绍 如果你在互联网上直接搜索陀螺仪,你将很可能得到如下图片: 这是一种基于角动量守恒的理论,用来感

  • 如果您的 Polar Verity Sense 传感器出现问题,可以将传感器重置为出厂设置。请注意,将传感器重置为出厂设置,会将传感器上的所有个人数据和设置清空,您需要重新设置传感器才可供您个人使用。您从传感器同步至 Flow 账户上的所有数据均安全。 要将传感器重置为出厂设置 进入 flow.polar.com/start,下载 Polar FlowSync 数据传输软件,并将其安装到您的电脑上

  • 光环板可以连接 mbuild 的 热运动传感器 模块进行编程。 1. 热运动传感器(1)检测到热运动? 如果指定热运动传感器检测到热运动,报告条件成立。 示例 按下光环板的按钮,如果热运动传感器1检测到热运动,光环板的LED灯环会显示红色。 2. 热运动传感器(1)检测到热运动的次数 报告指定热运动传感器检测到热运动的次数。 示例 按下光环板的按钮,如果热运动传感器1检测到热运动的次数大于16次,

  • 热运动传感器能够检测环境中是否有人或恒温动物经过。 原理介绍 热运动传感器使用了人体热释电红外传感器作为核心元器件。人体正常温度为37℃,对应10μm波长的红外光,热运动传感器正是通过检测环境中10μm波长红外光的变化,进而判断环境中是否有人体或附近温度热源的运动的。 为了尽可能敏锐地感知环境中的10μm红外光变化,热运动传感器使用了菲涅尔滤光片对红外光做了汇聚,使得传感器能够尽可能多地接受环境中

  • 热运动传感器能够检测环境中是否有人或恒温动物经过。 原理介绍 热运动传感器使用了人体热释电红外传感器作为核心元器件。人体正常温度为37℃,对应10μm波长的红外光,热运动传感器正是通过检测环境中10μm波长红外光的变化,进而判断环境中是否有人体或附近温度热源的运动的。 为了尽可能敏锐地感知环境中的10μm红外光变化,热运动传感器使用了菲涅尔滤光片对红外光做了汇聚,使得传感器能够尽可能多地接受环境中