2017-02-15 8 views
1

Так как я заявил в вопросе, я внедряю службы определения местоположения (google not android version), и я пытаюсь получить тост от метода, чтобы увидеть, что он вызывается, но мне не повезло. Если я удалить его, хотя я получаю ошибки на этой линии, и, следовательно, не могу запрашивать обновления местоположенияСлушатель местоположения Google Play не звонит, но программа все еще нуждается в его работе?

LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 

эта часть местоположения библиотеки слушателя или что-то? Я просто не могу понять, почему приложение не будет тосты, когда я изменю местоположение. Я много исследовал, но не могу найти ответ, поэтому я прошу здесь. Он собирает местоположение и подтачивает широту в методе handleNewLocation.

Вот мой код

package com.example.mick.mylocation; 

import android.app.Activity; 
import android.content.IntentSender; 
import android.location.Location; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.annotation.Nullable; 
import android.util.Log; 
import android.widget.Button; 
import android.widget.Toast; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 
import com.google.android.gms.maps.GoogleMap; 

public class MainActivity extends Activity implements 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener, 
     LocationListener 
     { 
    private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000; 
    private LocationRequest mLocationRequest; 

    private GoogleApiClient mGoogleApiClient; 
    public static final String TAG = MainActivity.class.getSimpleName(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mLocationRequest = LocationRequest.create() 
       .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
       .setInterval(10 * 1000)  // 10 seconds, in milliseconds 
       .setFastestInterval(1 * 1000); // 1 second, in milliseconds 


     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    protected void onPause() { 
     Toast.makeText(getApplicationContext(),"PAUSED ", Toast.LENGTH_LONG).show(); 

     super.onPause(); 
     if (mGoogleApiClient.isConnected()) { 
      LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
      mGoogleApiClient.disconnect(); 
     } 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 

      Toast.makeText(getApplicationContext(), "Location services conntected", Toast.LENGTH_LONG).show(); 
      Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
      if (location == null) { 
       LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
      } else { 
       handleNewLocation(location); 
      } 

     } 


    private void handleNewLocation(Location location) { 
     Toast.makeText(getApplicationContext(),"HANNDLE NEW LOCATION METHOD lat is "+location.getLatitude(), Toast.LENGTH_LONG).show(); 


    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     Toast.makeText(getApplicationContext(),"SUSPENDED", Toast.LENGTH_LONG).show(); 

    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

     if (connectionResult.hasResolution()) { 
      try { 
       // Start an Activity that tries to resolve the error 
       connectionResult.startResolutionForResult(this, CONNECTION_FAILURE_RESOLUTION_REQUEST); 
      } catch (IntentSender.SendIntentException e) { 
       e.printStackTrace(); 
      } 
     } else { 
      Log.i(TAG, "Location services connection failed with code " + connectionResult.getErrorCode()); 
      Toast.makeText(getApplicationContext(),"Location services connection failed with code " + connectionResult.getErrorCode(), Toast.LENGTH_LONG).show(); 

     } 

    } 


    @Override 
    public void onLocationChanged(Location location) { 
     Toast.makeText(getApplicationContext(),"ON LOCATION CHANGED METHOD", Toast.LENGTH_LONG).show(); 

//  handleNewLocation(location); 
    } 

} 

Благодаря

ответ

0

Я думаю, что вы никогда не делаете в onConnect() 1-й requestLocationUpdates(). Просто потому, что вы недавно подключены, это не значит, что getLastLocation() будет пустым. На самом деле вы надеетесь, что это не будет так, что дисплей может быть обновлен как можно скорее.

Попробуйте это:

if (location != null) { 
     handleNewLocation(location); 
    } 
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 

Это не помешает отправить новый requestLocationUpdates() каждый раз, когда вы подключены. (На самом деле, я думаю, что если изменение конфигурации привело к отключению & повторного подключения к GoogleApiClient, вам необходимо отправить новый запрос)

+0

Я попробовал этот код, хотя он до сих пор не сделал тост от onLocationChanged метода –

+0

Это работает на моем устройстве. Вы уверены, что на вашем телефоне включено «Местоположение»? – Gary99

+0

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

-1

Если бы я был вами, я бы спасся от ненужного шаблона и головной боли дело с googleApiClients помощью ReactiveLocation:

public class MainActivity extends Activity { 

    public static final String TAG = MainActivity.class.getSimpleName(); 
    private Subscription subscription; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mLocationRequest = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
      .setInterval(10 * 1000)  // 10 seconds, in milliseconds 
      .setFastestInterval(1 * 1000); // 1 second, in milliseconds 


     ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(context); 
     subscription = locationProvider.getUpdatedLocation(mLocationRequest) 
      .subscribe(new Action1<Location>() { 
       @Override 
       public void call(Location location) { 
        //This will be called every time a new location is received 
        Toast.makeText(getApplicationContext(), "Location updated", Toast.LENGTH_LONG).show(); 
       } 
      }); 

    } 

    @Override 
    public void onPause() { 
     //Make sure to stop listening for updates when you don't need them anymore 
     subscription.unsubscribe(); 
    } 
} 
+0

Вы правы, я должен был включить это в первую очередь. – Juuso