当我在Android中获得传感器值与opengl相结合时,总是会崩溃



我尝试使用传感器来获取原始、俯仰和滚转值。

但我将值发送到Renderer类或GLSurfaceView类

当我在智能手机上运行时,一切都会崩溃。

我尝试过使用:

MainActivity类或中的Renderer.raw = value[0];

Renderer类或中的MainActivity.x = raw;

使用功能:

void setRaw(float raw){
this.raw = raw;
}

和调用MainActivity中的函数。

所有的不幸。。。

这是我的代码:

主要活动:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        glView = new MyGLSurfaceView(this);
        setContentView(glView);

        baccel = false;
        bcompass = false;
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        accel = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        compass = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

    }
    @Override
    protected void onResume() {
        glView.onResume();
        mSensorManager.registerListener(this,
                accel,
                SensorManager.SENSOR_DELAY_NORMAL);
        mSensorManager.registerListener(this,
                compass,
                SensorManager.SENSOR_DELAY_NORMAL);
        super.onResume();
    }
    @Override
    protected void onPause() {
        glView.onPause();
        mSensorManager.unregisterListener(this, accel);
        mSensorManager.unregisterListener(this, compass);
        super.onPause();
    }
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
    public void onSensorChanged(SensorEvent event) {
        switch (event.sensor.getType()) {
        case Sensor.TYPE_ACCELEROMETER:
            for (int i = 0; i < 3; i++) {
                accelValues[i] = event.values[i];
            }
            baccel = true;
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            for (int i = 0; i < 3; i++) {
                compassValues[i] = event.values[i];
            }
            bcompass = true;
            break;
        }
        if (!baccel || !bcompass)
            return;
        if (SensorManager.getRotationMatrix(rotationMatrix, null, accelValues,
                compassValues)) {
            SensorManager.remapCoordinateSystem(rotationMatrix,
                    SensorManager.AXIS_X, SensorManager.AXIS_Z, rotationMatrix);
            SensorManager.getOrientation(rotationMatrix, values);
            update();
            baccel = false;
            bcompass = false;
        }
    }
    void update() {
        gv.setRaw(values[0]);
        gv.setPitch(values[1]);
        gv.setRoll(values[2]);
    }
}

和在MyGlSurfaceView:中

float raw, pitch, roll;
protected void setRaw(float raw){
    this.raw = raw;
}
protected void setPitch(float pitch){
    this.pitch = pitch;
}
protected void setRoll(float roll){
    this.roll = roll;
}

这是我的日志

有人能帮我吗?

我的初始化代码:

    import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity implements SensorEventListener {
    private GLSurfaceView glView;
    SensorManager mSensorManager;
    Sensor accel;
    Sensor compass;
    private MyGLSurfaceView gv;
    boolean baccel, bcompass = false;
    float[] accelValues = new float[3];
    float[] compassValues = new float[3];
    float[] rotationMatrix = new float[9];
    float[] values = new float[3];

MyGLSurfaceView初始化:

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.view.KeyEvent;
import android.view.MotionEvent;
public class MyGLSurfaceView extends GLSurfaceView {
    MyGLRenderer mRenderer;

    public MyGLSurfaceView(Context context) {
        super(context);
        mRenderer = new MyGLRenderer(context);
        this.setRenderer(mRenderer);
        this.requestFocus();
        this.setFocusableInTouchMode(true);
    }

我想你不知道这里发生了什么。

执行private MyGLSurfaceView gv;时,gv是一个null变量。这意味着,如果你不做类似gv = new ......的事情,它将在应用程序周期的剩余时间保持为空。这意味着update()将抛出NPE。

另一方面,你有glView = new MyGLSurfaceView(this);。这表明glView是MyGLSurfaceView,对吧?因此,即使MyGLSurfaceView扩展了GLSurfaceView ,也应该像private MyGLSurfaceView glView;而不是private GLSurfaceView glView;一样定义它

因此,您应该使用glView,因为它是您真正正确定义和实例化的唯一变量。但是要执行此操作,并且要使用设置角度方法,必须将private GLSurfaceView glView更改为private MyGLSurfaceView glView

结论:

private GLSurfaceView glView更改为private MyGLSurfaceView glView

删除gv并仅使用glView

最新更新