10
votes

Comment obtenir la direction à Android (comme le nord, l'ouest)

Je suis nouveau dans Android et je veux obtenir la direction en fonction de mon appareil photo. Comment puis-je obtenir des informations de direction en fonction de mon appareil photo? Pourriez-vous donner une idée à cela?


0 commentaires

4 Réponses :


1
votes

Vous ne savez pas ce que vous entendez en fonction de votre appareil photo, mais vous pouvez l'obtenir en fonction des capteurs matériels. Voir les liens suivants:

Exemple de Compass < / a>

Découvrez également le capteur type_orientation sur page.


1 commentaires

type_orientation est obsolète , voir Stackoverflow.com/a/23060896/1480391



11
votes

TYPE_OORIENTATION est obsolète

Nous ne pouvons plus utiliser le capteur d'orientation, nous pouvons utiliser le capteur de champ magnétique et les capteurs d'accéléromètre en tandem pour obtenir des fonctionnalités équivalentes. C'est plus de travail, mais il permet de continuer à utiliser un rappel pour gérer les changements d'orientation. P>

Voici un échantillon compas fort>: http://www.codingforandroid.com/2011/01/USTION -Orientation-capteurs-simple.html p>

conversion de accéléromètre et champ magnétique em> to azimut em>: p>

float rotation = -azimut * 360 / (2 * 3.14159f);


2 commentaires

Le lien ne semble pas fonctionner. Pouvez-vous s'il vous plaît donner un exemple ou un autre lien?


Assurez-vous web.archive.org/web/20180501005730/http://...



1
votes

Voici ce que j'ai jusqu'à présent qui travaille quelque peu pour moi, les valeurs retournées sont comprises entre 0 et 360 mais je ne pense pas que le nord est correctement calibré? J'utilise cela sur un pad LG G fonctionnant Android 5.0.1

public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
        mGravity = event.values;
    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
        mGeomagnetic = event.values;
    if (mGravity != null && mGeomagnetic != null) {
        float R[] = new float[9];
        float outR[] = new float[9];
        float I[] = new float[9];

        boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
        if (success) {
            float orientation[] = new float[3];

            SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X, SensorManager.AXIS_Y, outR);

            SensorManager.getOrientation(outR, orientation);
            azimut = orientation[0];

            float degree = (float)(Math.toDegrees(azimut)+360)%360;

            System.out.println("degree " + degree);


0 commentaires

-1
votes

Utilisez le capteur de vecteur de rotation, qui combine les capteurs géomagnétiques et gravitationnels. Ensuite, utilisez Sensormanager.getorientation se convertir d'un tableau de 5 valeurs à une matrice de rotation de style openGL. Comme la documentation indique, la première valeur est l'orientation de la boussole dans les radians.

En soi, cela ne résout pas votre problème de connaître la direction de la boussole du point de vue de votre appareil photo. Au contraire, il suppose que l'écran est parallèle au sol, comme une boussole de poche à l'ancienne, et elle rapporte de la manière dont le haut de l'écran est pointé. Ainsi, si le haut de l'écran est confronté au nord, l'orientation ( event.values ​​[0] code>) est 0. Si le haut de l'écran est pointé vers le haut, l'orientation est indéfinie. Malheureusement, il s'agit d'un cas commun lors de l'utilisation de votre appareil photo. P>

Dans l'exemple d'auditeur, j'utiliserai un Enum pour basculer entre l'orientation de style de poche par défaut de Android et l'orientation de la caméra arrière de la poche et la caméra arrière, afin que vous puissiez voir à la fois le Utilisez Case Android attend et celui que vous voulez. p> xxx pré>

puis écrivez un sensorevenervener code> pour suivre les modifications. Pour plus de clarté, je n'ai pas Importer android.hardware.sensormanager. * Code> dans le code ci-dessous. Tous les tableaux définis ci-dessous sont remplis de méthodes statiques sensormanager. P>

/** The latest compass orientation as a 3D vector. */
private var orientation3D = FloatArray(3)
private var coordinateSystem = CompassCoordinateSystem.REAR_CAMERA_ROTATION

fun compassDegrees(): Float = azimuthToDegrees(compassRadians())
fun compassRadians(): Float = orientation3D[0]

/** Convert such that North=0, East=90, South=180, West=270. */
fun azimuthToDegrees(azimuth: Float): Float {
    return ((Math.toDegrees(azimuth.toDouble())+360) % 360).toFloat()
}

override fun onSensorChanged(event: SensorEvent?) {
    if (event?.sensor?.type == Sensor.TYPE_ROTATION_VECTOR) {
         val rotationMatrix = FloatArray(9)
         SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values)
         when (coordinateSystem) {
            CompassCoordinateSystem.POCKET_COMPASS -> SensorManager.getOrientation(rotationMatrix, orientation3D)
            CompassCoordinateSystem.REAR_CAMERA -> {
                val rearCameraMatrix = FloatArray(9)
                // The axis parameters for remapCoordinateSystem() are
                // from an example in that method's documentation
                SensorManager.remapCoordinateSystem(rotationMatrix,
                    SensorManager.AXIS_X, 
                    SensorManager.AXIS_Z, 
                    rearCameraMatrix)
                SensorManager.getOrientation(rearCameraMatrix, orientation3D)
            }
        }
    }
}


2 commentaires

Ce n'est pas clair que vos variables font référence à. RotationVector, mvaluesorientation, etc.


@Jaswantsingh: J'ai réécrit l'exemple, pas seulement pour réparer les variables mais pour corriger l'orientation de la caméra.