es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Orientación del móvil utilizando los sensores integrados de Android.

Soy un traductor de español que traduce documentos de IT. Traduzca lo siguiente al español. No traduzca el código y la salida en formato markdown:

Soy un novato en este campo. Mi objetivo es hacer una aplicación de Android que, cuando esté en un vehículo, se utilice para medir la velocidad del vehículo utilizando los sensores incorporados de Android. El problema al que me enfrento es que puedo obtener la aceleración utilizando TYPELINEARACCELERATION. Pero muestra 3 valores diferentes de 3 ejes. Lo que puedo entender es que, para esta aplicación, debo verificar si el móvil está en posición horizontal, entonces debería considerar el eje Y y si el móvil está en posición vertical, entonces debería tomar el eje X. Pero ¿cómo puedo saber si el móvil está en posición horizontal o vertical? ¿Alguien puede ayudarme por favor?

Me está mostrando errores, solo copié tu código dado:
public void onSensorChanged(SensorEvent sensorEvent) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
display?.rotation
}else{
windowManager.defaultDisplay.orientation
}

float x=sensorEvent.values[0];
float y=sensorEvent.values[1];
float z=sensorEvent.values[2];

accelerationCurrentValue=Math.abs((Math.sqrt((xx)+(yy)+(zz))-9.8));
accelerationCurrentValue=(double)Math.round(accelerationCurrentValue
1000)/1000;

//actualizar vistas de textos
tv_accel.setText(String.valueOf(accelerationCurrentValue));
}

Me está mostrando errores
Cannot resolve symbol “display”, “rotation”, “windowManager”
¿Puedes decirme cómo resolverlos?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para corregir los errores en el código, necesitas agregar algunas importaciones necesarias e inicializar las variables respectivas.

    import android.content.Context;
    import android.hardware.SensorManager;
    import android.view.Display;
    import android.view.WindowManager;
    import androidx.appcompat.app.AppCompatActivity;
    import android.os.Bundle;
    
    public class MainActivity extends AppCompatActivity implements SensorEventListener {
    
        private SensorManager mSensorManager;
        private WindowManager mWindowManager;
        private Display mDisplay;
        private float[] mRotationMatrix = new float[9];
        private float[] mOrientation = new float[3];
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
            mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
            mDisplay = mWindowManager.getDefaultDisplay();
        }
    
        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
            if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                float x = sensorEvent.values[0];
                float y = sensorEvent.values[1];
                float z = sensorEvent.values[2];
    
                mSensorManager.getRotationMatrix(mRotationMatrix, null, sensorEvent.values, mDisplay.getRotation());
                mSensorManager.getOrientation(mRotationMatrix, mOrientation);
                float pitch = mOrientation[1];
                float roll = mOrientation[2];
    
                double accelerationCurrentValue = Math.sqrt(x * x + y * y + z * z) - SensorManager.GRAVITY_EARTH;
                accelerationCurrentValue = (double) Math.round(accelerationCurrentValue * 1000) / 1000;
    
                //actualizar vistas de texto
                tv_accel.setText(String.valueOf(accelerationCurrentValue));
            }
        }
    
        @Override
        public void onAccuracyChanged(Sensor sensor, int i) {
            //no es necesario
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            mSensorManager.unregisterListener(this);
        }
    }
    

    Nota: Este código asume que tienes un TextView llamado tv_accel para mostrar el valor de aceleración.

    Aquí, los métodos mSensorManager.getRotationMatrix() y mSensorManager.getOrientation() se utilizan para detectar si el teléfono está en modo horizontal o vertical, y ajustar los valores del eje X y Y en consecuencia.

    ¡Espero que esto sea de ayuda!

Comments are closed.