位置监听器在某些设备上工作有问题,迁移到FusedLocationListener也有问题



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

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();
         }
    }
}

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

作为推荐这个堆栈溢出答案,我试图迁移到LocationFusedLocation来解决这个问题,但我面临一些问题,在java类中添加GooglePlayServicesClient实现,因为这个库暂时被弃用,如此链接所述。所以…我能做什么?还有别的办法吗?

看起来你已经在使用GoogleApiClient了,所以你不需要任何帮助。你的代码已经被更新为不被弃用的方式。

只要做一些改变就可以解决你的问题,我看到还有一个问题没有提到。

首先,你提到你的位置监听器有问题,你需要重新启动活动,让它再次工作。

要解决这个问题,只需将连接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();
    }
}

最新更新