【问题标题】:Android Google Maps API GPS location is changing even when device is at the same place即使设备在同一个地方,Android Google Maps API GPS 位置也会发生变化
【发布时间】:2016-06-04 10:43:31
【问题描述】:

我正在为我的应用程序使用 Google Maps API。即使设备在同一个地方,我的 GPS 位置也在变化,据说该位置每 6 秒更新一次,因此它会不断更新,但每次更新它也会移动一点,有时移动很多。我的代码如下。我还会添加截图。

package b.a.location_tracker;

import android.graphics.Color;
import android.location.Location;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;


public class Map extends FragmentActivity implements OnMapReadyCallback, LocationListener, GoogleApiClient.ConnectionCallbacks {

private GoogleMap mMap;
Marker m;
private GoogleApiClient mGoogleApiClient;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);

    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

    this.buildGoogleApiClient();

    mGoogleApiClient.connect();

}

private synchronized void buildGoogleApiClient() {
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this).addApi(LocationServices.API)
            .build();
}

@Override
public void onMapReady(GoogleMap googleMap) {

    mMap = googleMap;
    LatLng sydney = new LatLng(28.6139, 77.2090);
    m=mMap.addMarker(new MarkerOptions().position(sydney).title("Delhi City"));
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 20));
}

@Override
public void onConnected(Bundle bundle) {
    LocationRequest mLocationRequest = createLocationRequest();
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, (LocationListener) this);

}

@Override
public void onConnectionSuspended(int i) {
    Log.d("TAG", "Connection to Google API suspended");

}

private LocationRequest createLocationRequest() {
    LocationRequest mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(6000);
    mLocationRequest.setFastestInterval(1000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    return mLocationRequest;
}

    @Override
public void onLocationChanged(Location location) {

    LatLng sydney = new LatLng(location.getLatitude(), location.getLongitude());
        LatLng a=m.getPosition();
        m.remove();
        m=mMap.addMarker(new MarkerOptions().position(sydney).title("Your Location"));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, mMap.getCameraPosition().zoom));
        Polyline line = mMap.addPolyline(new PolylineOptions().add(a,sydney).width(5).color(Color.RED));

}

}

请记住我的手机在同一个地方,因此它不应该移动。

This is a screenshot of the app

【问题讨论】:

    标签: android google-maps gps locationlistener


    【解决方案1】:

    您是否尝试将 minDisplacementDistance 添加到您的 LocationRequest ?

    private LocationRequest createLocationRequest() {
        LocationRequest mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(6000);
        mLocationRequest.setFastestInterval(1000);
        mLocationRequest.setSmallestDisplacement(200); 
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        return mLocationRequest;
    } 
    

    如果您设置此参数(默认为 0),如果 GPS 找到的新位置在先前找到的位置的 200 米半径内,则不会每次调用 LocationChanged 侦听器。

    现在你的 onLocationChange 监听器每 6 秒调用一次,最小距离等于 0。由于 GPS 不是 100% 正确,你会得到很多不同的位置。在您将 minimumDisplacement 更改为更高之后,将不会经常调用它。

    【讨论】:

    • 您好,感谢您的帮助。我会试试这个并让你知道,但问题是这只是我正在尝试制作的应用程序的一部分。这个想法是通过服务器将此设备的位置传输到另一台设备,以便它可以在他/她的设备上查看该设备的位置。因此,如果我更改 minDisplacementDistance 不会影响最终应用程序,因为它应该显示正在遍历的路线。让我知道:)
    • @niharika 我正在开发与您描述的相同类型的应用程序。有什么办法可以让我找到正确的资源或应用程序的源代码(如果它是开源的)。谢谢
    【解决方案2】:

    有时由于设置精度低,数据会从 Wifi 网络接收。选中您的 Android 手机上的设置/位置/使用无线网络复选框。

    【讨论】:

    • 此外,如果他/她在建筑物中,gps 会如此混乱且总是在变化。也许有时也会跳过下一栋楼:)
    • @prat 您好,感谢您的帮助。我会尽力让你知道。我的手机没有连接到 WiFi,我正在使用手机上的数据连接。
    • @Yasin 我被认为是同样的事情。有什么方法可以确保位置准确。这将是一个交通应用程序,它将向乘坐交通工具的孩子的父母显示位置,如果它显示出如此大的波动,那就不好了。
    • @niharika 我会发布答案。
    【解决方案3】:

    你试过mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

    当我使用LocationRequest.PRIORITY_HIGH_ACCURACY 时,Gps 总是在使用并且总是在建筑物中变化。我改变了准确度,然后位置变化小于。

    你可以看看这个:

    /*
        Priority                update interval      Battery drain per hour (%)     Accuracy
        HIGH_ACCURACY           5 seconds                   7.25%                   ~10 meters
        BALANCED_POWER          20 seconds                  0.6%                    ~40 meters
        NO_POWER                N/A                         small                   ~1 mile
    
    */
    

    并使用:

    public static void createLocationRequest() {
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(UPDATE_INTERVAL);
        mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
        mLocationRequest.setSmallestDisplacement(DISPLACEMENT);
    }
    
    private static int UPDATE_INTERVAL = 20000; // 20 second
    private static int FASTEST_INTERVAL = 10000; // 10 second
    private static int DISPLACEMENT = 50; // minimum change to get location 
    

    【讨论】:

    • 会试试这个。谢谢:)
    【解决方案4】:

    从您的代码中删除这两行:

    mLocationRequest.setInterval(6000);
    mLocationRequest.setFastestInterval(1000);
    

    【讨论】:

    • 您好,感谢您的帮助。我会尽力让你知道。只是我试图显示设备是否移动,如果是,那么它就是路线。这样做会影响这个想法吗?是否还会显示更改?
    • 我试过了,但现在它没有显示任何位置变化
    猜你喜欢
    • 1970-01-01
    • 2019-01-11
    • 2016-01-18
    • 2015-07-02
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多