Я пытаюсь получить знак компаса в градусах (то есть 0-360), используя следующий метод:
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); } } }
Значение азимута (т.е. orientation[0]
) должно быть 0 <= азимут <360, но я получаю только значения от -3 до 3 при вращении моего устройства. Может кто-нибудь, пожалуйста, скажите мне, что может быть проблемой?
Значения находятся в радиусе, вам нужно преобразовать в степень дуги
int azimut = (int) Math.round(Math.toDegrees(orientation[0]));
Это правда, что в Radians. Спасибо Хоан. Я добавил некоторую логику, чтобы получить этот подшипник в градусах от 0 до 360, потому что, если бы я только преобразовал его в градусы, я получал значения от -180 до 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)); }