【问题标题】:FusedLocationProviderClient doesn't have bearing dataFusedLocationProviderClient 没有方位数据
【发布时间】:2018-08-01 08:04:40
【问题描述】:

我在 android 中使用 FusedLocationProviderClient 类来获取用户的最后位置。一切都很好,我可以得到纬度和经度,但 task.getResult().getBearing() 返回 0.0task.getResult().hasBearing() 返回 false。如何获取用户的方位信息?

我在 AndroidManifest 文件和运行时都获得了 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION 权限。

这是与我正在使用的用户位置相关的代码:

@SuppressLint("MissingPermission")
private void getLastLocation() {
    fusedLocationClient
            .getLastLocation()
            .addOnCompleteListener(this, new OnCompleteListener<Location>() {
                @Override
                public void onComplete(@NonNull Task<Location> task) {
                    if (task.isSuccessful() && task.getResult() != null) {
                        onLocationChange(task.getResult());
                        Log.i(TAG, "lat " + task.getResult().getLatitude() + " lng " + task.getResult().getLongitude());
                        Log.i(TAG, "bearing? " + task.getResult().hasBearing());
                    } else {
                        Toast.makeText(MainActivity.this, "Location Not Found!", Toast.LENGTH_SHORT).show();
                    }
                }
            });

}

private void onLocationChange(Location location) {
    //do something
}

【问题讨论】:

  • 你能告诉我们你是如何构造LocationRequest(哪些标志和参数)的吗?
  • @ArsenyLevin 我只是在我的fusedLocationClient 上打电话给getLastLocation。我更改了代码并将 intervalfastestIntervalperiority 参数添加到 LocationRequest 但仍然 hasBearing() 返回 false。

标签: android location fusedlocationproviderclient


【解决方案1】:

根据documentation

如果此位置没有方位,则返回 0.0。

【讨论】:

  • 没错,但我想知道为什么该位置没有方位,以及是否有办法解决这个问题。
【解决方案2】:

我使用加速度计磁场传感器解决了我的问题。 ThisCompass 类我用来获取我的手机的轴承:

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

public class Compass implements SensorEventListener {
    private static final String TAG = "Compass";

    public interface CompassListener {
        void onNewAzimuth(float azimuth);
    }

    private CompassListener listener;

    private SensorManager sensorManager;
    private Sensor gsensor;
    private Sensor msensor;

    private float[] mGravity = new float[3];
    private float[] mGeomagnetic = new float[3];
    private float[] R = new float[9];
    private float[] I = new float[9];

    private float azimuth;
    private float azimuthFix;

    public Compass(Context context) {
        sensorManager = (SensorManager) context
                .getSystemService(Context.SENSOR_SERVICE);
        gsensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        msensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
    }

    public void start() {
        sensorManager.registerListener(this, gsensor,
                SensorManager.SENSOR_DELAY_GAME);
        sensorManager.registerListener(this, msensor,
                SensorManager.SENSOR_DELAY_GAME);
    }

    public void stop() {
        sensorManager.unregisterListener(this);
    }

    public void setAzimuthFix(float fix) {
        azimuthFix = fix;
    }

    public void resetAzimuthFix() {
        setAzimuthFix(0);
    }

    public void setListener(CompassListener l) {
        listener = l;
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        final float alpha = 0.97f;

        synchronized (this) {
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

                mGravity[0] = alpha * mGravity[0] + (1 - alpha)
                        * event.values[0];
                mGravity[1] = alpha * mGravity[1] + (1 - alpha)
                        * event.values[1];
                mGravity[2] = alpha * mGravity[2] + (1 - alpha)
                        * event.values[2];

                // mGravity = event.values;

                // Log.e(TAG, Float.toString(mGravity[0]));
            }

            if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
                // mGeomagnetic = event.values;

                mGeomagnetic[0] = alpha * mGeomagnetic[0] + (1 - alpha)
                        * event.values[0];
                mGeomagnetic[1] = alpha * mGeomagnetic[1] + (1 - alpha)
                        * event.values[1];
                mGeomagnetic[2] = alpha * mGeomagnetic[2] + (1 - alpha)
                        * event.values[2];
                // Log.e(TAG, Float.toString(event.values[0]));

            }

            boolean success = SensorManager.getRotationMatrix(R, I, mGravity,
                    mGeomagnetic);
            if (success) {
                float orientation[] = new float[3];
                SensorManager.getOrientation(R, orientation);
                // Log.d(TAG, "azimuth (rad): " + azimuth);
                azimuth = (float) Math.toDegrees(orientation[0]); // orientation
                azimuth = (azimuth + azimuthFix + 360) % 360;
                // Log.d(TAG, "azimuth (deg): " + azimuth);
                if (listener != null) {
                    listener.onNewAzimuth(azimuth);
                }
            }
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
}

我通过将 352 添加到此类的onNewAzimuth 方法收到的方位上来校准值,并在我的代码中使用它:

    Compass compass = new Compass(this);
    Compass.CompassListener cl = new Compass.CompassListener() {

        @Override
        public void onNewAzimuth(float azimuth) {
            // using (360 - (azimuth) + 8) value
        }
    };
    compass.setListener(cl);

【讨论】:

    猜你喜欢
    • 2019-05-22
    • 2023-01-17
    • 2019-08-19
    • 2019-05-09
    • 2017-12-10
    • 2018-11-20
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    相关资源
    最近更新 更多