Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在活动之间传递加速计值-应用程序崩溃_Java_Android_Android Activity - Fatal编程技术网

Java 在活动之间传递加速计值-应用程序崩溃

Java 在活动之间传递加速计值-应用程序崩溃,java,android,android-activity,Java,Android,Android Activity,我试图通过侦听器活动将抖动速度传递给主活动,但代码就是不起作用。它说“应用程序不幸停止了” 侦听器代码: import android.app.Activity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardwar

我试图通过侦听器活动将抖动速度传递给主活动,但代码就是不起作用。它说“应用程序不幸停止了”

侦听器代码:

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;


/**
 * Listener that detects shake gesture.
 */
public class AccReader implements SensorEventListener {

    Activity foo;

    SensorManager manager;
    Sensor accelerometer;

    private static final int MIN_FORCE = 10;


    private static final int MIN_DIRECTION_CHANGE = 3;


    private static final int MAX_PAUSE_BETHWEEN_DIRECTION_CHANGE = 200;


    private static final int MAX_TOTAL_DURATION_OF_SHAKE = 400;


    private long mFirstDirectionChangeTime = 0;


    private long mLastDirectionChangeTime;

    /** How many movements are considered so far. */
    private int mDirectionChangeCount = 0;

    /** The last x position. */
    private float lastX = 0;

    /** The last y position. */
    private float lastY = 0;

    /** The last z position. */
    private float lastZ = 0;

    /** OnShakeListener that is called when shake is detected. */
    private OnShakeListener mShakeListener;

    private float totalMovement;

    public AccReader(Activity foo) {
        this.foo = foo;
        manager = (SensorManager) this.foo.getSystemService(Context.SENSOR_SERVICE);
        accelerometer = manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
        manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);
    }


    /**
     * Interface for shake gesture.
     */
    public interface OnShakeListener {

        /**
         * Called when shake gesture is detected.
         */
        void onShake();
    }


    public void setOnShakeListener(OnShakeListener listener) {
        mShakeListener = listener;
    }

    public float getTotalMovement() {
        return this.totalMovement;
    }

    @Override
    public void onSensorChanged(SensorEvent se) {
        // get sensor data
        float x = se.values[SensorManager.DATA_X];
        float y = se.values[SensorManager.DATA_Y];
        float z = se.values[SensorManager.DATA_Z];

        // calculate movement
        totalMovement = Math.abs(x + y + z - lastX - lastY - lastZ);

        if (totalMovement > MIN_FORCE) {

            // get time
            long now = System.currentTimeMillis();

            // store first movement time
            if (mFirstDirectionChangeTime == 0) {
                mFirstDirectionChangeTime = now;
                mLastDirectionChangeTime = now;
            }

            // check if the last movement was not long ago
            long lastChangeWasAgo = now - mLastDirectionChangeTime;
            if (lastChangeWasAgo < MAX_PAUSE_BETHWEEN_DIRECTION_CHANGE) {

                // store movement data
                mLastDirectionChangeTime = now;
                mDirectionChangeCount++;

                // store last sensor data
                lastX = x;
                lastY = y;
                lastZ = z;

                // check how many movements are so far
                if (mDirectionChangeCount >= MIN_DIRECTION_CHANGE) {

                    // checkk total duration
                    long totalDuration = now - mFirstDirectionChangeTime;
                    if (totalDuration < MAX_TOTAL_DURATION_OF_SHAKE) {
                        mShakeListener.onShake();
                        resetShakeParameters();
                    }
                }

            } else {
                resetShakeParameters();
            }
        }
    }

    /**
     * Resets the shake parameters to their default values.
     */
    private void resetShakeParameters() {
        mFirstDirectionChangeTime = 0;
        mDirectionChangeCount = 0;
        mLastDirectionChangeTime = 0;
        lastX = 0;
        lastY = 0;
        lastZ = 0;
    }

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

}
代码已正确编译,但生成的APK无法运行。 谁能说明我可能做错了什么

另外,我对安卓系统的开发还完全陌生

编辑: 日志:


main活动
不需要是
抽象的
,也不需要实现
SensorEventListener
。我也不知道你为什么要使用两个
AccReader
对象

以下是固定的
main活动
代码:

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private SensorManager mSensorManager;
    private Sensor mAccelerometer;
    AccReader acc;
    private EditText output;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        mSensorManager.registerListener(new AccReader(this), mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
        output = (EditText) findViewById(R.id.editText1);
        acc = new AccReader(this);

        acc.setOnShakeListener(new AccReader.OnShakeListener() {
            @Override
            public void onShake() {
                refresh();
            }

        });

    }

    public void refresh() {
        output.setText("X:" + acc.getTotalMovement());
    }

    @Override
    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(acc,
                mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_UI);
    }

    @Override
    protected void onPause() {
        mSensorManager.unregisterListener(acc);
        super.onPause();
    }
}
最后一件事是对
AccReader
中的
mShakeListener
进行空检查,因为抖动事件似乎会触发多次,并使侦听器感到困惑

调用
onShake

if(mShakeListener != null)
    mShakeListener.onShake();

请从日志中发布整个错误。您是否可以将整个
main活动
代码发布为well@AndrewBrooke哦,对不起,我没有注意到主活动的完整代码没有粘贴。现在也这么做了。回答得很好,但你可能想链接/向提问者解释为什么用户错误地使用了
abstract
,以及在最后一段代码中使用了括号。谢谢安德鲁。让它工作起来。另外,如果我想获得突然加速的“快照”值,您能建议进行更改吗?谢谢Bonatti。我解释了一遍。这是非常需要的谢谢你把博纳蒂联系起来。里特,
acreader
不就是这么做的吗?在测试过程中,快速移动手机会触发震动事件是的,它应该会触发震动事件,但现在,当我移动手机时,它会给出绝对加速度的累进值。
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private SensorManager mSensorManager;
    private Sensor mAccelerometer;
    AccReader acc;
    private EditText output;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        mSensorManager.registerListener(new AccReader(this), mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
        output = (EditText) findViewById(R.id.editText1);
        acc = new AccReader(this);

        acc.setOnShakeListener(new AccReader.OnShakeListener() {
            @Override
            public void onShake() {
                refresh();
            }

        });

    }

    public void refresh() {
        output.setText("X:" + acc.getTotalMovement());
    }

    @Override
    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(acc,
                mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_UI);
    }

    @Override
    protected void onPause() {
        mSensorManager.unregisterListener(acc);
        super.onPause();
    }
}
if(mShakeListener != null)
    mShakeListener.onShake();