2017-10-14 4 views
0

J'essaie d'obtenir l'emplacement actuel en utilisant ce code et cela fonctionne lors du lancement de l'application et lors de la mise au premier plan. Les toasts apparaissent dans les deux cas, mais sinon ils ne le font pas. Quelqu'un peut-il me dire où j'ai foiré?onLocationChanged non appelé dans Android 6.0 API 23

public class LocationFragment extends Fragment implements GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener, LocationListener { 

double oldLon,oldLat; 

private static final String TAG = MainActivity.class.getSimpleName();  // LogCat tag 
private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 1000; 
private static final int MY_PERMISSIONS_REQUEST_FINE_LOCATION = 100; 
private Location mLastLocation; 
private GoogleApiClient mGoogleApiClient; 
private FusedLocationProviderClient mFusedLocationClient; 

private LocationRequest mLocationRequest; 

// Location updates intervals in sec 
private static int UPDATE_INTERVAL = 10000; // 10 sec 
private static int FATEST_INTERVAL = 5000; // 5 sec 


@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 

    // First we need to check availability of play services 
    if (checkPlayServices()) { 

     buildGoogleApiClient(); 
     createLocationRequest(); 
    } 

} 

@Override 
public void onDetach() { 
    mCallback = null; // => avoid leaking 
    super.onDetach(); 
} 


public interface InterfaceTextClicked { 
    public void sendText(String text); 
} 


private boolean checkPermission(){ 

    if(ActivityCompat.checkSelfPermission(getContext(), 
      ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){ 
     System.out.println("We have been granted."); 
     return true;} 
    else return false; 
} 

private void requestPermission(){ 
    ActivityCompat.requestPermissions(getActivity(),new String[] 
      {ACCESS_FINE_LOCATION},MY_PERMISSIONS_REQUEST_FINE_LOCATION); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_FINE_LOCATION: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! 
       System.out.println("Permission Granted!"); 

      } else { 

       // permission denied, boo! 
       System.out.println("Permission Denied!"); 

       if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ 
        if(shouldShowRequestPermissionRationale(ACCESS_FINE_LOCATION)){ 
         new AlertDialog.Builder(getActivity()) 
           .setMessage("Permission needed to access your location.") 
           .setPositiveButton("OK", new DialogInterface.OnClickListener(){ 
            @Override 
            public void onClick(DialogInterface dialog,int which){ 
             if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ 
              requestPermissions(new String[]{ACCESS_FINE_LOCATION}, 
                MY_PERMISSIONS_REQUEST_FINE_LOCATION); 
             } 
            } 
           }) 
           .setNegativeButton("Cancel", null) 
           .create() 
           .show(); 
         return; 
        } 
       } 
      } 
      // return; 
     } 
     } 
} 

private void displayLocation(){ 

    System.out.println("Inside displayLocation"); 

    requestPermission(); 

    if(checkPermission()){ 
     mLastLocation = LocationServices.FusedLocationApi 
       .getLastLocation(mGoogleApiClient); 
    } 

    if (mLastLocation != null) { 
     double latitude = mLastLocation.getLatitude(); 
     double longitude = mLastLocation.getLongitude(); 

     System.out.println("Location1: "+latitude+" "+longitude); 
     if(Double.compare(oldLat,latitude)==0 || Double.compare(oldLon,longitude)==0){ 
      Toast.makeText(getContext(), "Location didn't change! "+latitude+ " "+ longitude, 
        Toast.LENGTH_LONG).show(); 
     }else{ 
      Toast.makeText(getContext(), "Location changed! NEW: "+latitude+ " "+ longitude+" OLD: "+oldLat+ " "+oldLon, 
        Toast.LENGTH_LONG).show(); 
     } 

     // mCallback.sendText(latitude+" "+longitude); 

     oldLon = longitude; 
     oldLat = latitude; 

    } else { 
     System.out.println("Couldn't get coordinates"); 
     if(mGoogleApiClient.isConnected()){ 
      System.out.println("Client connected"); 
     }else{ 
      System.out.println("Client NOT connected"); 
     } 
    } 
} 

/** 
* Creating google api client object 
* */ 
protected synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(getContext()) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API).build(); 

} 

/** 
* Method to verify google play services on the device 
* */ 
private boolean checkPlayServices() { 
    GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance(); 
    int resultCode = googleAPI.isGooglePlayServicesAvailable(getContext()); 
    if (resultCode != ConnectionResult.SUCCESS) { 
     if(googleAPI.isUserResolvableError(resultCode)){ 
      googleAPI.getErrorDialog(getActivity(),resultCode, 
        PLAY_SERVICES_RESOLUTION_REQUEST).show(); 
     } else { 
      Toast.makeText(getContext(), 
        "This device is not supported.", Toast.LENGTH_LONG) 
        .show(); 
      getActivity().finish(); 
     } 
     return false; 
    } 
    return true; 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    if (mGoogleApiClient != null) { 
     mGoogleApiClient.connect(); 
    } 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    if (mGoogleApiClient != null && !mGoogleApiClient.isConnected()) { 
     mGoogleApiClient.connect(); 
    } 
    checkPlayServices(); 
} 


@Override 
public void onStop() { 
    super.onStop(); 
    if (mGoogleApiClient.isConnected()) { 
     mGoogleApiClient.disconnect(); 
    } 
} 

/** 
* Creating location request object 
* */ 
protected void createLocationRequest() { 
    mLocationRequest = LocationRequest.create(); 
    mLocationRequest.setInterval(UPDATE_INTERVAL); 
    mLocationRequest.setFastestInterval(FATEST_INTERVAL); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); } 

/** 
* Starting the location updates 
* */ 
protected void startLocationUpdates() { 

    System.out.println("Inside startLocationUpdates"); 
    requestPermission(); 
    if(checkPermission()){ 

     if ((mGoogleApiClient != null) && (mGoogleApiClient.isConnected())){ 

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

     } 
    } 
} 


/** 
* Google api callback methods 
*/ 
@Override 
public void onConnectionFailed(ConnectionResult result) { 
    Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = " 
      + result.getErrorCode()); 

} 

@Override 
public void onConnected(Bundle arg0){ 

     startLocationUpdates(); 
     // Once connected with google api, get the location 
     displayLocation(); 

} 

@Override 
public void onConnectionSuspended(int arg0) { 
    mGoogleApiClient.connect(); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    stopLocationUpdates(); 
} 



/** 
* Stopping location updates 
*/ 
protected void stopLocationUpdates() { 
    if ((mGoogleApiClient != null) && (mGoogleApiClient.isConnected())) { 
     LocationServices.FusedLocationApi.removeLocationUpdates(
       mGoogleApiClient, this); 
    } 
} 


@Override 
public void onLocationChanged(Location location) { 
    // Assign the new location 
    mLastLocation = location; 

    Toast.makeText(getContext(), "******Location changed!", 
      Toast.LENGTH_SHORT).show(); 

    // Displaying the new location on UI 
    displayLocation(); 

} 

}

Désolé de mettre tellement de code là-bas, je pensais que mon erreur pourrait être nulle part donc ne voulait pas couper quoi que ce soit.

Le journal affiche les éléments suivants:

10-14 01:10:27.408 14485-14485/com.android.wy.parkingauthoritytickingsystem I/System.out: Inside startLocationUpdates 
10-14 01:10:27.536 14485-14485/com.android.wy.parkingauthoritytickingsystem I/System.out: We have been granted. 
10-14 01:10:27.610 14485-14485/com.android.wy.parkingauthoritytickingsystem I/System.out: Inside displayLocation 
10-14 01:10:27.617 14485-14485/com.android.wy.parkingauthoritytickingsystem I/System.out: We have been granted. 
10-14 01:10:27.641 14485-14485/com.android.wy.parkingauthoritytickingsystem I/System.out: Location1: 40.4868602 -74.4388156 
+0

Pouvez-vous être plus précis À quel moment les messages de changement d'emplacement doivent-ils être envoyés? Est-ce que le problème est qu'une fois que vous recevez la première mise à jour, vous ne recevez pas de mises à jour supplémentaires lorsque l'application est ouverte (mais que le téléphone a probablement été déplacé)? Vous désactivez les mises à jour lorsque votre activité est en pause, de sorte que vous ne les obtiendrez pas en arrière-plan. –

+0

@MykWillis Comme indiqué dans le code, je m'attends à recevoir des mises à jour toutes les 5-10 secondes. Oui, le problème est que je ne reçois plus de mises à jour après la première (oui, le téléphone bouge). Je ne m'attends pas à ce que l'application fonctionne en arrière-plan ou quoi que ce soit, je veux juste qu'elle affiche des mises à jour pendant que l'application est au premier plan .. – Shameed

Répondre

0

Je ne vois rien de mal à votre évidemment le code, mais il fait son API appelle à travers le deprecated versions of the location APIs plutôt que le new FusedLocationProviderClient interface.

Pendant que vous déclarez un nouveau style FusedLocationProviderClient:

private FusedLocationProviderClient mFusedLocationClient; 

vous ne l'initialiser ou l'utiliser lors de l'exécution; plutôt que vous appelez par FusedLocationApi (l'ancienne méthode):

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

Vous pouvez essayer d'utiliser la nouvelle API, qui dispose d'une interface légèrement plus robuste, pour faire la lumière sur votre problème. Vous pouvez obtenir la nouvelle interface API avec:

mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); 

Ensuite, vous aurez juste besoin de modifier votre classe pour ajouter un rappel onLocationAvailability selon the documentation avant de fixer votre auditeur:

mFusedLocationClient.requestLocationUpdates(mLocationRequest, 
      mLocationCallback, 
      null /* Looper */); 
+0

Merci de m'avoir indiqué la bonne direction. Je vais regarder dedans. :) – Shameed