【问题标题】:Android Location getBearing() always returns 0Android Location getBearing() 总是返回 0
【发布时间】:2015-10-01 23:52:09
【问题描述】:

我一直在尝试为我的 Android 应用实现一项功能,该功能可以获取设备的速度和行进方向,无论设备指向何处。例如:如果我的 Android 设备指向北方,并且我正在向南向后移动,它会返回我正在向南移动。

我一直在环顾四周,我想出了使用 Location 的 getBearing() 方法的可能性(不过,我不知道这是否能解决我的整个问题)。当我调用 getBearing() 时,由于某种原因它总是返回 0.0。我不知道为什么。这是我的代码:

LocationManager lm;
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gcm);
    setUpUI(findViewById(R.id.LinearLayout1));
    isRegged = false;

    // GCM startup
    gcm = GoogleCloudMessaging.getInstance(this);
    context = getApplicationContext();

    gps = new GPSTracker(context);
    // gps.startListening(context);
    // gps.setGpsCall(this);

    /*
     * Variables to indicate location and device ID
     */
    TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

    if (gps.getIsGPSTrackingEnabled())
    {
        longitude = Double.valueOf(gps.getLongitude()).toString();
        latitude = Double.valueOf(gps.getLatitude()).toString();
    }

    deviceID = telephonyManager.getDeviceId();

    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

    lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, (float) 0.0,
            this);
}

这就是我得到轴承的地方。

@Override
public void onLocationChanged(Location currentLocation)
{
    float speed = 0;
    float speed_mph = 0;

    if (previousLocation != null)
    {
        float distance = currentLocation.distanceTo(previousLocation);

        // time taken (in seconds)
        float timeTaken = ((currentLocation.getTime() - previousLocation
                .getTime()) / 1000);

        // calculate speed
        if (timeTaken > 0)
        {
            speed = getAverageSpeed(distance, timeTaken);
            speed_mph = (float) (getAverageSpeed(distance, timeTaken) / 1.6);
        }

        if (speed >= 0)
        {
            info_text.setVisibility(View.VISIBLE);
            info_text_mph.setVisibility(View.VISIBLE);

            DecimalFormat df = new DecimalFormat("#.#");
            info_text.setText("Speed: " + df.format(speed) + " " + "km/h");
            info_text_mph.setText("  Speed: " + df.format(speed_mph) + " "
                    + "mph");

            if (speed >= 10 && lm.getProvider(LocationManager.GPS_PROVIDER).supportsBearing())
            {
                float degree = currentLocation.getBearing();

                direction_text.setVisibility(View.VISIBLE);

                Log.i(TAG, String.valueOf(degree));

                if (degree == 0 && degree < 45 || degree >= 315
                        && degree == 360)
                {
                    direction_text.setText("You are: Northbound");
                }

                if (degree >= 45 && degree < 90)
                {
                    direction_text.setText("You are: NorthEastbound");
                }

                if (degree >= 90 && degree < 135)
                {
                    direction_text.setText("You are: Eastbound");
                }

                if (degree >= 135 && degree < 180)
                {
                    direction_text.setText("You are: SouthEastbound");
                }

                if (degree >= 180 && degree < 225)
                {
                    direction_text.setText("You are: SouthWestbound");
                }

                if (degree >= 225 && degree < 270)
                {
                    direction_text.setText("You are: Westbound");
                }

                if (degree >= 270 && degree < 315)
                {
                    direction_text.setText("You are: NorthWestbound");
                }

            }

        }
    }
    previousLocation = currentLocation;

}

非常感谢!

【问题讨论】:

    标签: java android location locationmanager bearing


    【解决方案1】:

    如果您使用LocationManager.NETWORK_PROVIDER 获取数据,getBearing() 将返回 0,因为信号/准确性太弱。尝试将 GPS 提供程序设置为 GPS,并确保在室外进行测试(由于卫星没有直接通信,GPS 在室内或非常高的建筑物中间无法工作)

    为确保您选择的提供者支持 getBearing(),您可以使用来自 LocationProvider 的方法称为 supportsBearing (),如果您选择的提供者支持 getBearing() 调用,则返回 true。

    最后确保您在 AndroidManifest.xml 中拥有 ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION 权限

    按照我的建议,代码应该是这样的:

    LocationManager mlocManager =
    
    (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    
    LocationListener mlocListener = new MyLocationListener();
    
    
    mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
    

    资源: http://developer.android.com/reference/android/location/LocationManager.html http://developer.android.com/reference/android/location/LocationProvider.html http://www.firstdroid.com/2010/04/29/android-development-using-gps-to-get-current-location-2/

    更新:答案是在 getBearing() 中用于计算的两个点太接近,因此给出了不准确的结果。要纠正此问题,请手动抓取两个 GPS 点并使用 BearingTo() 来查看更准确的结果。

    【讨论】:

    • 感谢您的反馈,我很抱歉我完全忘记在我的帖子中提到我正在使用 GPS 提供商。我会更新我的代码。
    • 您是否尝试在室外使用 getBearing() 并远离高层建筑或其他可能妨碍您进行卫星通信的物体?
    • 是的,我做到了。我在开车时尝试过测试该功能。虽然速度非常准确(5-10 公里),但 getBearing() 始终返回 0,无论我去哪个方向,它总是返回“你是:北行”。
    • 那么supportsBearing()方法的结果是真的吗?
    • @The_Martian 保留旧位置或 1 或 2 秒前位置的变量,并手动计算方向。如果你每次都这样做,它就不够准确,无法提供正确的方向。
    猜你喜欢
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多