Android Compass指向我的位置而不是北

不飞则已,一飞冲天;不鸣则已,一鸣惊人。这篇文章主要讲述Android Compass指向我的位置而不是北相关的知识,希望能为你提供帮助。
我正在开发指南针应用程序,我希望指南针指向特定的纬度经度位置,而不是通常的北方。我找到了一些与我的问题有关的questions,但我没有设法让它们为我工作。这是我的代码:

public class MainActivity extends AppCompatActivity implements SensorEventListener { private ImageView image; private float currentDegree = 0f; private SensorManager mSensorManager; private TextView tvHeading; private Location location = new Location("A"); private Location target = new Location("B"); private LocationManager locationManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); image = (ImageView) findViewById(R.id.imageViewCompass); tvHeading = (TextView) findViewById(R.id.tvHeading); mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); location.setLatitude(54.903535); location.setLongitude(23.979342); target.setLatitude(54.904618); target.setLongitude(23.978782); }@Override protected void onResume() { super.onResume(); mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_GAME); }@Override protected void onPause() { super.onPause(); mSensorManager.unregisterListener(this); // to stop the listener and save battery }@Override public void onSensorChanged(SensorEvent event) { float degree = Math.round(event.values[0]); tvHeading.setText("Heading: " + Float.toString(degree) + " degrees"); RotateAnimation ra = new RotateAnimation( currentDegree, -degree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); ra.setDuration(210); ra.setFillAfter(true); image.startAnimation(ra); currentDegree = -degree; }@Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // not in use } }

目前我的指针只显示在北方,而不是我的编码目标位置。
答案【Android Compass指向我的位置而不是北】我想我找到了这样做的方法:这是我改变以获得预期行为的方法(基于this问题和CookieMonster答案)
@Override public void onSensorChanged(SensorEvent event) { // get the angle around the z-axis rotated float degree = Math.round(event.values[0]); degree += geoField.getDeclination(); float bearing = location.bearingTo(target); degree = (bearing - degree) * -1; degree = normalizeDegree(degree); tvHeading.setText("Heading: " + Float.toString(degree) + " degrees"); // create a rotation animation (reverse turn degree degrees) RotateAnimation ra = new RotateAnimation( currentDegree, -degree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); // how long the animation will take place ra.setDuration(210); // set the animation after the end of the reservation status ra.setFillAfter(true); // Start the animation image.startAnimation(ra); currentDegree = -degree; }private float normalizeDegree(float value) { if (value > = 0.0f & & value < = 180.0f) { return value; } else { return 180 + (180 + value); } }


    推荐阅读