2015-08-03 1 views
1

I've следующего кода, получить текущее местоположение уплотнительного устройства:Места слушателя есть проблемы в работы в некоторых устройствах и проблемах мигрировать в 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(); 

     } 
    } 
} 

Этого код работает отлично, но в некоторых устройствах не работает , чтобы добиться успеха с помощью этого кода, я должен перезапустить устройство или закрыть его и снова открыть, поэтому я хочу избежать этой проблемы.

Как рекомендовать stack overflow aswer я пытался перейти на LocationFusedLocation, чтобы решить эту проблему, но я столкнуться с некоторыми проблемами при добавлении GooglePlayServicesClient реализует в классе Java, потому что эта библиотека временно осуждается как сказал этот link. Итак ... что я могу сделать? Есть ли другой способ сделать это?

+0

ответ на этот вопрос для второго звена показывает вам, как зарегистрироваться на месте обновляет новый путь, так следует, что – tyczj

+0

Похоже, все, что вам нужно сделать, это переместить весь код из OnCreate() (за исключением setContentView()) в onResume(), и ваши проблемы должны исчезнуть. –

+0

@ DanielNugent нормально, я попробую –

ответ

0

Похоже, вы уже используете GoogleApiClient, поэтому вам не нужна помощь. Ваш код уже обновлен до не устаревшего способа его выполнения.

Только пара изменений должна решить ваши проблемы, и я вижу еще одну проблему, о которой не упоминалось.

Во-первых, вы отмечаете, что у вас возникли проблемы с прослушивателем местоположения, и вам нужно снова запустить 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() (у вас может быть уже это в вашем fu LL-код):

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

    } 

} 
+1

Да, я сделал это в onPause, но я забыл задать свой вопрос, единственное, что мне было нужно, это установить в onResume код, который я вставляю onCreate, спасибо –

Смежные вопросы