Android Kompasslager

Ich versuche, den Kompass in Grad zu erhalten (dh 0-360) mit der folgenden Methode:

float[] mGravity; float[] mGeomagnetic; 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 I[] = new float[9]; boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic); if (success) { float orientation[] = new float[3]; SensorManager.getOrientation(R, orientation); float azimut = orientation[0]; bearing.setText("Bearing: "+ azimut); } } } 

Der Azimutwert (dh orientation[0] ) sollte 0 <= Azimut <360 sein, aber ich bekomme nur Werte von -3 bis 3, während ich mein Gerät drehe. Kann mir bitte jemand sagen was das Problem vielleicht sein könnte?

  • Wie erkennt man meine Bildschirmorientierung im Portrait-gesperrten Bildschirm in Android?
  • Schalten Sie den Bildschirm programmgesteuert aus, wenn das Gesicht den Bildschirm auf Android schließt
  • Warum ist die Höhenänderung, wenn es Abend oder Nacht ist?
  • 3 Solutions collect form web for “Android Kompasslager”

    Die Werte sind in radian, du musst in Bogengrad umwandeln

     int azimut = (int) Math.round(Math.toDegrees(orientation[0])); 

    Es ist wahr, dass es in Radians ist. Danke Hoan. Ich habe einige Logik hinzugefügt, um dieses Lager in Grad von 0 bis 360 zu bekommen. Wenn ich es nur in Grad umwandelte, bekam ich Werte von -180 bis 180.

     float azimuthInRadians = orientation[0]; float azimuthInDegress = (float)Math.toDegrees(azimuthInRadians)+360)%360; 
     This answer applies to Google Maps api v2. It is possible by registering your application with Sensor Listener for Orientation and get the angle relative to true north inside onSensorChanged and update camera accordingly. Angle can be used for bearing. Following code can be used: Instead of using Sensor.TYPE_ORIENTATION try using getOrinetation api. Sensor.TYPE_ORIENTATION has been deprecated. @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); if (sensorManager != null) sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_GAME); } public void onSensorChanged(SensorEvent event) { float compassBearingRelativeToTrueNorth = Math.round(event.values[0]); Log.d(TAG, "Degree ---------- " + degree); updateCamera(compassBearingRelativeToTrueNorth); } private void updateCamera(float bearing) { CameraPosition oldPos = googleMap.getCameraPosition(); CameraPosition pos = CameraPosition.builder(oldPos).bearing(bearing) .build(); googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(pos)); } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.