2017-02-05 3 views
-7

Ich verwende Fused Location, um den aktuellen Standort meines Geräts abzurufen, aber der von mir implementierte Code gibt immer NULL zurück. Ich habe überprüft, dass mein Gerät auf ON steht und auf High Accuracy Mode eingestellt ist. Bitte sagen Sie, was das Problem in meinem Code ist?Fused Location gibt immer null zurück

Mein Code:

import android.app.Activity; 
import android.content.Context; 
import android.content.IntentSender; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.os.Bundle; 
import android.support.v4.content.ContextCompat; 
import android.util.Log; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.common.api.PendingResult; 
import com.google.android.gms.common.api.ResultCallback; 
import com.google.android.gms.common.api.Status; 
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.location.LocationSettingsRequest; 
import com.google.android.gms.location.LocationSettingsResult; 
import com.google.android.gms.location.LocationSettingsStatusCodes; 



public class FusedLocationTest implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 

    private static Location mLastLocation; 
    private static GoogleApiClient mGoogleApiClient; 
    private static Context context; 


    public Location getCurrentLocation(Context context) { 
     this.context = context; 
     buildGoogleApiClient(); 
     mGoogleApiClient.connect(); 
     if ((ContextCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)) { 
     } 
     mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
     return mLastLocation; 
    } 


    /*connect to fused location provider*/ 
    synchronized void buildGoogleApiClient() { 
     mGoogleApiClient = new GoogleApiClient.Builder(context) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
    } 


    @Override 
    public void onConnected(Bundle bundle) { 

    } 


    @Override 
    public void onLocationChanged(Location location) { 

    } 


    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     buildGoogleApiClient(); 
    } 


    @Override 
    public void onConnectionSuspended(int i) { 

    } 

} 

Anruf auf die Schaltfläche Click:

@Override 
    public void onClick(View v) { 
     Location l = new FusedLocationTest().getCurrentLocation(this); 
     if(l!=null) 
      Toast.makeText(this,l.getLatitude()+", "+l.getLongitude(), Toast.LENGTH_SHORT).show(); 
     else 
      Toast.makeText(this,"NULL LOCATION", Toast.LENGTH_LONG).show(); 
    } 

Antwort

1

Fügen Sie diesen Code zu Ihrem onConnected hinzu, das heißt, wo der letzte bekannte Ort angezeigt wird.

private static Location mLastLocation; 
private static GoogleApiClient mGoogleApiClient; 
private static Context context; 

// added 
private LocationRequest mLocationRequest; 
private Double latitude; 
private Double longitude; 
private String TAG = ""; // set your TAG 

@Override 
public void onConnected(Bundle bundle) { 

    if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     return; 
    } 
    startLocationUpdates(); 
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
    if(mLastLocation == null){ 
     startLocationUpdates(); 
    } 

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

     // set your tag 
     Log.d(TAG, String.valueOf(latitude)); 
     Log.d(TAG, String.valueOf(longitude)); 

    } else { 
     Toast.makeText(context, "Location not Detected, Did you turn off your location?", Toast.LENGTH_SHORT).show(); 
    } 
} 

protected void startLocationUpdates() { 
    // Create the location request 
    mLocationRequest = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
      .setInterval(30 * 1000) 
      .setFastestInterval(5 * 1000); 

    // Request location updates 
    if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     return; 
    } 
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
} 

Und entfernen Sie synchronisiert von Ihrer Methode, nur um es öffentlich zu machen. So etwas wie folgt:

public void buildGoogleApiClient() { } 
1

Die mGoogleApiClient.connect() Funktion ist asynchron. Sie müssen bis onConnected warten, bis der letzte Standort verfügbar ist. Es gibt ein klares Beispiel dafür in der documentation.

Verwandte Themen