Compass dans Android

J'essaie de programmer une boussole avec Android en utilisant l'accéléromètre et le capteur de champ magnétique, maintenant je me demande comment obtenir l'angle correct pour ma boussole.

J'ai lu dans les valeurs de l'accéléromètre et du capteur de champ magnétique dans "accele" et "magne" respectivement. Pour obtenir l'angle, j'exécute ce qui suit:

  • Le projet de bibliothèque Android utilise le style de déclaration: comment compiler?
  • Ouvrez Google Maps à partir d'un lien hypertexte
  • Dynamic GridLayout
  • JNI: passer plusieurs paramètres dans la signature de la fonction pour GetMethodID
  • Android Studio dit utiliser Gradle 1.10 - mais la nouvelle version est 1.12?
  • Comment obtenir le nom de GetPopActivity ou obtenir le nom du paquet de l'application en cours d'exécution dans lollipop?
  • float R[] = new float[9]; float I[] = new float[9]; boolean success = SensorManager.getRotationMatrix(R, I, accele, magne); if(success) { float orientation[] = new float[3]; SensorManager.getOrientation(R, orientation); azimuth = orientation[0]; // contains azimuth, pitch, roll .... 

    Plus tard, j'utilise une matrice de rotation pour mettre mon aiguille:

     rotation.setRotate(azimuth, compass.getWidth() / 2, compass.getHeight() / 2); canvas.drawBitmap(needle, rotation, null); 

    Maintenant, la documentation de getOrientation indique que l'orientation [0] devrait être la rotation autour de l'axe z. La documentation pour TYPE_ORIENTATION indique que "Azimuth, angle entre la direction nord magnétique et l'axe des y, autour de l'axe z (0 à 359). 0 = Nord, 90 = Est, 180 = Sud, 270 = Ouest".

    Mon azimut n'est cependant pas compris entre 0 et 359, mais plutôt autour de -2 à 2. Quel est exactement l'azimut de getOrientation et comment puis-je le convertir en angle?

  • Custom build.xml d'Android pour renommer le paquet manifeste
  • Modifier l'arrière-plan de ProgressDialog
  • Android.widget, textView ne peut pas être diffusé sur android.widget, bouton
  • Créer un bitmap à partir de la zone d'écran spécifiée
  • Colonne invalide supprimée en essayant d'interroger une colonne
  • Retarder les actions dans Android
  • 3 Solutions collect form web for “Compass dans Android”

    Utilisez ce qui suit pour convertir de l'azimut donné en radians (-PI, + PI) en degrés (0, 360)

     float azimuthInRadians = orientation[0]; float azimuthInDegress = (float)Math.toDegrees(azimuthInRadians); if (azimuthInDegress < 0.0f) { azimuthInDegress += 360.0f; } 

    Noms de variables utilisés pour la commodité 😉

    Un extrait de code pourrait être obtenu à partir de https://github.com/iutinvg/compass

    Il n'utilise pas d'objets périmés, applique le filtre passe-bas.

    J'ai trouvé ceci dans ApiDemos de Google:

      /* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.apis.graphics; import android.app.Activity; import android.content.Context; import android.graphics.*; import android.hardware.SensorListener; import android.hardware.SensorManager; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.SystemClock; import android.util.Config; import android.util.Log; import android.view.View; public class Compass extends GraphicsActivity { private static final String TAG = "Compass"; private SensorManager mSensorManager; private SampleView mView; private float[] mValues; private final SensorListener mListener = new SensorListener() { public void onSensorChanged(int sensor, float[] values) { if (Config.LOGD) Log.d(TAG, "sensorChanged (" + values[0] + ", " + values[1] + ", " + values[2] + ")"); mValues = values; if (mView != null) { mView.invalidate(); } } public void onAccuracyChanged(int sensor, int accuracy) { // TODO Auto-generated method stub } }; @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); mView = new SampleView(this); setContentView(mView); } @Override protected void onResume() { if (Config.LOGD) Log.d(TAG, "onResume"); super.onResume(); mSensorManager.registerListener(mListener, SensorManager.SENSOR_ORIENTATION, SensorManager.SENSOR_DELAY_GAME); } @Override protected void onStop() { if (Config.LOGD) Log.d(TAG, "onStop"); mSensorManager.unregisterListener(mListener); super.onStop(); } private class SampleView extends View { private Paint mPaint = new Paint(); private Path mPath = new Path(); private boolean mAnimate; private long mNextTime; public SampleView(Context context) { super(context); // Construct a wedge-shaped path mPath.moveTo(0, -50); mPath.lineTo(-20, 60); mPath.lineTo(0, 50); mPath.lineTo(20, 60); mPath.close(); } @Override protected void onDraw(Canvas canvas) { Paint paint = mPaint; canvas.drawColor(Color.WHITE); paint.setAntiAlias(true); paint.setColor(Color.BLACK); paint.setStyle(Paint.Style.FILL); int w = canvas.getWidth(); int h = canvas.getHeight(); int cx = w / 2; int cy = h / 2; canvas.translate(cx, cy); if (mValues != null) { canvas.rotate(-mValues[0]); } canvas.drawPath(mPath, mPaint); } @Override protected void onAttachedToWindow() { mAnimate = true; super.onAttachedToWindow(); } @Override protected void onDetachedFromWindow() { mAnimate = false; super.onDetachedFromWindow(); } } } 

    Comme vous pouvez le voir, obtenez les degrés entre 0 et 360

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.