位置侦听器在某些设备中有问题,并且有问题需要迁移到FusedLocationListener

时间:2015-08-03 16:01:21

标签: android locationlistener android-fusedlocation

我有以下代码获取设备的当前位置:

public class MapPlace extends AppCompatActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener
{
    private LocationRequest mLocationRequest;
    private GoogleApiClient mGoogleApiClient;
    private Location mLastLocation;
    // location coordinates
    double dLatitude = 0.0;
    double dLongitude = 0.0;

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

          if (mGoogleApiClient == null || !mGoogleApiClient.isConnected())
          {
               buildGoogleApiClient();
               mGoogleApiClient.connect();
          }

          MapFragment mapF = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
         if (mapF != null)
            mapF.getMapAsync(this);
        }

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

        @Override
        public void onConnected(Bundle bundle) {
           mLocationRequest = new LocationRequest();
           mLocationRequest.setInterval(1000);
           mLocationRequest.setFastestInterval(1000);
           mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
           LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
         }

         @Override
         public void onConnectionSuspended(int i) {}

         @Override
         public void onConnectionFailed(ConnectionResult connectionResult) {}

         @Override
         public void onLocationChanged(Location location)
         {
             mLastLocation = location;
             dLatitude = mLastLocation.getLatitude();
             dLongitude = mLastLocation.getLongitude();

         }
    }
}

此代码工作正常,但在某些设备无效,要使用此代码获得成功,我必须重启设备或关闭并重新打开活动,所以我想避免这个问题。

建议这个stack overflow aswer我尝试迁移到LocationFusedLocation来解决这个问题,但是我在java类中添加GooglePlayServicesClient实现时遇到了一些问题,因为这个库暂时被弃用了link。 那么......我该怎么办?还有其他办法吗?

1 个答案:

答案 0 :(得分:0)

看起来您已经在使用GoogleApiClient,因此您不需要任何帮助。您的代码已经更新为不推荐的方式。

只需要进行一些更改即可解决您的问题,我还会看到另外一个未提及的问题。

首先,您提到您在使用Location侦听器时遇到问题,并且您需要重新启动Activity以使其再次运行。

要解决此问题,只需将连接GoogleApiClient的代码从onCreate()移动到onResume():

@Override
public void onResume() {
    super.onResume();

    if (mGoogleApiClient == null || !mGoogleApiClient.isConnected())
    {
        buildGoogleApiClient();
        mGoogleApiClient.connect();
    }

    MapFragment mapF = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
    //only call getMapAsync() again if mMap is null:
    if (mapF != null && mMap == null)
        mapF.getMapAsync(this);

}

另一个问题是您应该在onPause()中取消注册位置更新,以便在用户离开您的应用时您的应用不会继续请求位置更新:

@Override
public void onPause() {
    super.onPause();

    //added to stop location updates when Activity is no longer active
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
}

以下是应该适合您的完整类代码,请注意我还添加了一个GoogleMap引用,并将其设置在onMapReady()回调中(您可能已在完整代码中使用此代码):

public class MapPlace extends AppCompatActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener
{
    private LocationRequest mLocationRequest;
    private GoogleApiClient mGoogleApiClient;
    private Location mLastLocation;
    // location coordinates
    double dLatitude = 0.0;
    double dLongitude = 0.0;

    GoogleMap mMap;

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

    }

    @Override
    public void onResume() {
        super.onResume();

        if (mGoogleApiClient == null || !mGoogleApiClient.isConnected())
        {
            buildGoogleApiClient();
            mGoogleApiClient.connect();
        }

        MapFragment mapF = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
        //only call getMapAsync() again if mMap is null:
        if (mapF != null && mMap == null)
            mapF.getMapAsync(this);

    }

    @Override
    public void onPause() {
        super.onPause();

        //added to stop location updates when Activity is no longer active
        LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
    }


    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
    }

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

    @Override
    public void onConnected(Bundle bundle) {
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(1000);
        mLocationRequest.setFastestInterval(1000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
    }

    @Override
    public void onConnectionSuspended(int i) {}

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {}

    @Override
    public void onLocationChanged(Location location)
    {
        mLastLocation = location;
        dLatitude = mLastLocation.getLatitude();
        dLongitude = mLastLocation.getLongitude();

    }

}