FusedLocationProviderApi中获取错误的当前GPS位置

3
我有以下的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或网络提供者。 - Mohammad Haidar
@Haidar 我使用了 GPSTracker.java 类来获取当前位置,但我感觉它没有频繁更新当前位置...所以我放弃了它。 - Himanshu
1个回答

0

如果您想要,可以使用网络或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问题就解决了吗? - Himanshu
这个方法有三个选项,第一个是GPS提供者,它是最准确的提供者,但需要开阔的空间,也就是说不能在室内使用;第二个是网络提供者,只要您有互联网连接,就可以通过您的网络获取位置,如果精度不是问题,那么这是适合您的选择。被动提供者意味着您想要获取位置,而不需要请求它,如果另一个应用程序已经检索到位置,那么您将拥有该位置。根据您认为适合的情况选择一个并使用它。 - Mohammad Haidar
你可以通过以下代码控制更新时间和距离频率: locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 时间(毫秒), 距离(米), locationListener); - Mohammad Haidar
感谢您的详细解释,但我已经在使用FusedLocation提供程序了...请问我应该在代码中的哪里设置您上述的方法?能否请您指导一下我? - Himanshu
只需在OnStartCommand()方法中调用它,而不是写"locationListener",因为您正在实现位置监听器,如果您想要GPS提供程序,请传递"GPS"或网络提供程序,请传递"Network"。 - Mohammad Haidar
还是不太顺利......我觉得我需要根据FusedLocation API找到解决方案。 - Himanshu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接