У прослушивателя местоположения есть проблемы с работой на некоторых устройствах и проблемы с переходом на 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, чтобы решить эту проблему, но столкнулся с некоторыми проблемами при добавлении реализации GooglePlayServicesClient в java. class, потому что эта библиотека временно устарела, как указано в этой ссылке. Так что я могу сделать? Есть ли другой способ сделать это?


person Rene Limon    schedule 03.08.2015    source источник
comment
ответ на этот вопрос для второй ссылки показывает, как зарегистрироваться для обновления местоположения по-новому, поэтому следуйте этому   -  person tyczj    schedule 03.08.2015
comment
Похоже, все, что вам нужно сделать, это переместить весь ваш код из onCreate() (кроме setContentView()) в onResume(), и ваши проблемы должны исчезнуть.   -  person Daniel Nugent    schedule 03.08.2015
comment
@DanielNugent хорошо, я попробую   -  person Rene Limon    schedule 03.08.2015


Ответы (1)


Похоже, вы уже используете 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();

    }

}
person Daniel Nugent    schedule 03.08.2015
comment
Да, я сделал это в onPause, но я забыл задать свой вопрос, единственное, что мне нужно было, это установить в onResume код, который я добавил в onCreate, спасибо - person Rene Limon; 03.08.2015