安卓加速度计类的问题

3

我试图将我的加速度计类嵌入到我的第二个活动中,但我总是得到一个强制转换异常。这是我的加速度计类:

package com.example.lincision;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;

public class Accelerometer implements SensorEventListener {

    private float xAxis;
    private float yAxis;
    private float zAxis;
    private float lastX, lastY, lastZ;

    public float getX() {
        return this.xAxis;
    }

    public float getY() {
        return this.yAxis;
    }

    public float getZ() {
        return this.zAxis;
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    @Override
    public void onSensorChanged(SensorEvent event) {

        // get the change of the x,y,z values of the accelerometer
        xAxis = Math.abs(lastX - event.values[0]);
        yAxis = Math.abs(lastY - event.values[1]);
        zAxis = Math.abs(lastZ - event.values[2]);

    }

}

这里是我的第二个活动,但它根本不起作用,也许有人知道我需要改变什么。

package com.example.lincision;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;

import com.javacodegeeks.androidaccelerometerexample.R;

public class SecondActivity extends Activity {



    TextView outputX;
    TextView outputY;
    TextView outputZ;

    SensorManager manager;
    Sensor accelerometer;

    SensorManager sensorManager;


    TextView currentX, currentY, currentZ;

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.secondactivity);

    initializeViews();
    displayCleanValues();
    // display the current x,y,z accelerometer values
    displayCurrentValues();

    sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

    accelerometer = sensorManager
            .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    sensorManager.registerListener((SensorEventListener) acc,
            accelerometer, SensorManager.SENSOR_DELAY_NORMAL);

}
    Accelerometer acc = new Accelerometer();
    public void initializeViews() {
        currentX = (TextView) findViewById(R.id.currentX);
        currentY = (TextView) findViewById(R.id.currentY);
        currentZ = (TextView) findViewById(R.id.currentZ);

    }

    private float deltaX = acc.getX();
    private float deltaY = acc.getY();
    private float deltaZ = acc.getZ();



    public void displayCleanValues() {
        currentX.setText("0.0");
        currentY.setText("0.0");
        currentZ.setText("0.0");
    }



    // display the current x,y,z accelerometer values
    public void displayCurrentValues() {
        currentX.setText(Float.toString(deltaX));
        currentY.setText(Float.toString(deltaY));
        currentZ.setText(Float.toString(deltaZ));
    }

}

以下是我的错误信息:

01-14 12:36:58.751: E/AndroidRuntime(18696): java.lang.RuntimeException: Unable to start activity       ComponentInfo{com.javacodegeeks.androidaccelerometerexample/com.example.lincision.SecondActivity}:      java.lang.ClassCastException: com.example.lincision.SecondActivity cannot be cast to android.hardware.SensorEventListener
01-14 12:36:58.751: E/AndroidRuntime(18696):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2394)
01-14 12:36:58.751: E/AndroidRuntime(18696):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2452)
01-14 12:36:58.751: E/AndroidRuntime(18696):    at android.app.ActivityThread.access$900(ActivityThread.java:172)
01-14 12:36:58.751: E/AndroidRuntime(18696):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1302)
01-14 12:36:58.751: E/AndroidRuntime(18696):    at android.os.Handler.dispatchMessage(Handler.java:102)
01-14 12:36:58.751: E/AndroidRuntime(18696):    at android.os.Looper.loop(Looper.java:136)
01-14 12:36:58.751: E/AndroidRuntime(18696):    at android.app.ActivityThread.main(ActivityThread.java:5586)
01-14 12:36:58.751: E/AndroidRuntime(18696):    at java.lang.reflect.Method.invokeNative(Native Method)
01-14 12:36:58.751: E/AndroidRuntime(18696):    at java.lang.reflect.Method.invoke(Method.java:515)
01-14 12:36:58.751: E/AndroidRuntime(18696):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
01-14 12:36:58.751: E/AndroidRuntime(18696):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
01-14 12:36:58.751: E/AndroidRuntime(18696):    at dalvik.system.NativeStart.main(Native Method)
01-14 12:36:58.751: E/AndroidRuntime(18696): Caused by: java.lang.ClassCastException: com.example.lincision.SecondActivity cannot be cast to android.hardware.SensorEventListener
2个回答

3

SensorManager.registerListener需要将SensorEventListener对象作为参数传递,而您没有在SecondActivity中实现SensorEventListener

由于您已经在Accelerometer中实现了SensorEventListener,因此请将acc作为registerListener的第一个参数传递:

sensorManager.registerListener((SensorEventListener)acc, accelerometer,
                SensorManager.SENSOR_DELAY_NORMAL);

是的,这就是错误,谢谢。但是我没有任何输出,textView什么也没显示,你知道可能是什么原因吗? - Ben Betzen
1
@BenBetzen:在onSensorChanged方法中添加日志,然后检查该方法是否被调用。 - ρяσѕρєя K
@ ρяσѕρєя K,我在onSensorChanged里添加了日志,在那里我有一个输出,因此错误一定在SecondActivity中,但是我不知道错误可能在哪里。 - Ben Betzen
我真的毫无头绪。 - Ben Betzen

1
由于:java.lang.ClassCastException: com.example.lincision.SecondActivity无法转换为android.hardware.SensorEventListener,因此出现问题。 正如错误所述,您将Activity强制转换为SensorEventListener。 这是导致问题的行:
sensorManager.registerListener((SensorEventListener) this, accelerometer,
            SensorManager.SENSOR_DELAY_NORMAL);

不要在registerListener中将this转换为SensorEventListener,因为this是指SecondActivity,并且它没有实现SensorEventListener。相反,传递acc,它是实现SensorEventListener的Accelerometer对象,这是registerListener所需的第一个参数:
sensorManager.registerListener((SensorEventListener)acc, accelerometer,
            SensorManager.SENSOR_DELAY_NORMAL);

谢谢,是的我明白你的意思,但如果我按照你告诉我的写法,我会得到这个错误信息:类型SensorManager中的registerListener(SensorEventListener,Sensor,int)方法不适用于参数(SecondActivity,Sensor,int)。 - Ben Betzen
2
正如@ρяσѕρєя K所提到的,将加速度计(acc)对象作为第一个参数传递,因为它实现了SensorEventListener。我也更新了我的代码。虽然我之前回答不正确,但还是要给予+1 ρяσρєя K的回答 :) - Melquiades

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接