Sensor.TYPE_ROTATION_VECTOR нет значений? - PullRequest
1 голос
/ 08 января 2020

Товарищи!

Я пытался создать приложение в Android Studio, где экран меняет цвет всякий раз, когда экран наклонен на 45 градусов или более. Проблема в том, что ничего не происходит!

Слушатель успешно регистрируется, но тост, который я подготовил в методе onSensorChanged, так и не вызывается, что говорит о том, что показаний нет. Что-то я пропустил?

С уважением и благодарностью заранее.

РЕДАКТИРОВАТЬ: Я исправил тост, как предложено Энди (спасибо). Теперь я могу видеть, какие показания я получаю, поскольку приложение не работает должным образом.

EDIT2: После того, как я смог посмотреть показания, я заставил приложение работать! Преобразование в градусы действительно работало как задумано, и я получал постоянные показания. Пришлось сменить этот тост на текстовое представление, чтобы из него получился какой-то смысл. ПРОБЛЕМА РЕШЕНА

public class RotationVectorActivity extends AppCompatActivity implements SensorEventListener {
    private SensorManager sensorManager;
    private Sensor rotationVector;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.rotation_vector_layout);

        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        rotationVector = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);

        if(rotationVector == null) {
            MainActivity.showToast(this, "Proximity sensor not available.");
            finish();
        } else {
            registerListener();
        }
    }

    public void launchMain(View view) {
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        Toast.makeText(getApplicationContext(), "We got this far?", Toast.LENGTH_SHORT);
        float[] rotationMatrix = new float[16];
        SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values);

        //Remap coordinate system
        float[] remappedRotationMatrix = new float[16];
        SensorManager.remapCoordinateSystem(rotationMatrix,
                SensorManager.AXIS_X,
                SensorManager.AXIS_Z,
                remappedRotationMatrix);

        //Convert to orientations
        float[] orientations = new float[3];
        SensorManager.getOrientation(remappedRotationMatrix, orientations);

        //Convert radians to degrees
        for(int i = 0; i < 3; i++) {
            orientations[i] = (float)(Math.toDegrees(orientations[i]));
        }

        if(orientations[2] > 45) {
            getWindow().getDecorView().setBackgroundColor(Color.YELLOW);
        } else if (orientations[2] < -45) {
            getWindow().getDecorView().setBackgroundColor(Color.BLUE);
        } else if (Math.abs(orientations[2]) < 10) {
            getWindow().getDecorView().setBackgroundColor(Color.WHITE);
        }
    }

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

    }

    @Override
    protected void onResume() {
        super.onResume();
        registerListener();
    }

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

    public void registerListener() {
        sensorManager.registerListener(this, rotationVector, SensorManager.SENSOR_DELAY_NORMAL);
        MainActivity.showToast(this, "Rotation vector listener registered.");

    }

    public void unregisterListener() {
        sensorManager.unregisterListener(this);
        MainActivity.showToast(this, "Rotation vector listener unregistered.");
    }
}
...