位置侦听器在某些设备上存在问题,并且在迁移到 FusedLocationListener 时存在问题

Location listener have problems to works in some devices and problems to migrate to 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();

         }
    }
}

这段代码工作正常,但在某些设备上不起作用,为了使用这段代码获得成功,我必须重新启动设备或关闭并重新打开 activity,所以我想避免这个问题。

推荐这个stack overflow aswer I tried to migrate to LocationFusedLocation to solve this issue but I face some problems adding GooglePlayServicesClient implements in java class because this library is temporally deprecated as said this 。 那么……我能做什么?还有其他方法吗?

您似乎已经在使用 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);
}

这是应该适合您的完整 class 代码,请注意我还添加了一个 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();

    }

}