【问题标题】:Getting Incorrect current GPS location in FusedLocationProviderApi在 FusedLocationProviderApi 中获取不正确的当前 GPS 位置
【发布时间】:2016-08-30 06:22:36
【问题描述】:

我有关注LocationService.java 服务类。

public class LocationService extends Service
        implements LocationListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {
    private static final long INTERVAL = 1000 * 60;
    private static final long FASTEST_INTERVAL = 1000 * 5;
    Location mLastLocation;
    private GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;
    String lat, lon;


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        mGoogleApiClient.connect();
        return START_STICKY;
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onConnected(Bundle bundle) {
        mLocationRequest = LocationRequest.create();
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        mLocationRequest.setInterval(INTERVAL);
        mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                mGoogleApiClient);
        if (mLastLocation != null) {
            lat = String.valueOf(mLastLocation.getLatitude());
            lon = String.valueOf(mLastLocation.getLongitude());

            Util.WriteSharePrefrence(getApplicationContext(), "track_lat", "" + lat);
            Util.WriteSharePrefrence(getApplicationContext(), "track_lng", "" + lon);

        }
    }

    @Override
    public void onCreate() {
        int permissionCheck = ContextCompat.checkSelfPermission(LocationService.this, Manifest.permission.ACCESS_FINE_LOCATION);

        if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
            //Execute location service call if user has explicitly granted ACCESS_FINE_LOCATION..
            buildGoogleApiClient();
        }
    }


    @Override
    public void onConnectionSuspended(int i) {
    }

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

    @Override
    public void onLocationChanged(Location location) {
        if (location != null) {
            Util.WriteSharePrefrence(getApplicationContext(), "track_lat", "" + location.getLatitude());
            Util.WriteSharePrefrence(getApplicationContext(), "track_lng", "" + location.getLongitude());
        }
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        buildGoogleApiClient();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

在上面的位置服务中,我正在做的是。 1.设置最快间隔每5秒刷新一次位置。 2. 一旦位置可用onLocationChanged() 将发生。在onLocationChanged() 方法中,我在共享首选项中写入当前纬度和经度。 3. 该服务将在后台24小时运行以获取当前位置。

我在清单中提到了这两个位置条件,如下所示:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

我的问题是:

有时onLocationChanged() 方法采用错误的纬度经度 例如:印度的用户设备,它采用美国地址。设备版本为Xolo - 4.2.1.(India)

是设备特定的问题吗?或者我需要在我的代码中改变什么? 我应该怎么做才能让我的定位服务更好?

【问题讨论】:

  • 您为什么不使用常规的位置服务提供商?像 GPS 或网络提供商
  • @Haidar 我使用 GPSTracker.java 类来获取当前位置,但我觉得它不会经常更新当前位置位置...所以我使用了它。

标签: android location fusedlocationproviderapi


【解决方案1】:

如果需要,请使用网络或 GPS 提供商或被动

public void Request_LocationUpdate(String type)
{
    if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
    {
        ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION}, 12);
    }
    else
    {
      LocationManager  locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);

        switch (type)
        {
            case "Passive":
                locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER,10000,10,locationListener);
                break;

            case "GPS":
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,10000,10,locationListener);
                break;

            case "Network":
                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,10000,10,locationListener);
                break;
        }
    }


}

【讨论】:

  • 你确定通过添加PASSIVE_PROVIDER来解决问题吗?
  • 此方法有 3 个选项,一个是 GPS 提供者,它是最准确的提供者,但它需要露天,这意味着不是室内,第二个是网络提供者,只要您通过网络获取您的位置有互联网连接,如果准确性对你来说不是问题,这是合适的。被动提供者意味着如果另一个应用程序已经在检索位置,您希望在不请求的情况下获取位置,因此您将让该位置选择一个您认为合适的位置并使用它
  • 你可以通过locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,time(ms),distance(meters),locationListener); 控制更新时间和距离频率;
  • 感谢您的精彩解释,但我已经在使用 fusedlocation 提供程序 ....我在哪里可以在我的代码中设置上述方法?你能指导我吗...?
  • 只需在 OnStartCommand() 方法中调用它,而不是“locationListener”,而是写“this”,因为您正在实现位置监听器。如果您希望 GPS 提供商通过“GPS”或网络提供商通过“网络”
猜你喜欢
  • 2011-02-11
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
相关资源
最近更新 更多