2015-02-13 3 views
12

Also habe ich die neue Fused Location Provider API implementiert, um einen Standort des Benutzers zu erhalten, aber aus irgendeinem Grund kann ich keinen Standort erhalten, wenn das GPS nicht eingeschaltet ist. Nicht immer, haben Benutzer ihr GPS an und ich möchte sie nicht bitten müssen, ihr GPS bei jedem Laden der App einzuschalten. Wie kann ich der API mitteilen, dass sie mir einen Standort mit dem verfügbaren Anbieter zur Verfügung stellt?Fused Location Provider bekommt keinen Standort, außer GPS ist

Hier ist mein Code:

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

    public interface OnLocationChangedListener { 
     public void OnLocationChanged(Location location); 
    } 

    private final String TAG = "SE8611"; 
    private boolean mRequestingLocationUpdates = true; 

    private OnLocationChangedListener mCallBack; 

    Service locationService; 
    private LocationRequest locationRequest; 
    private GoogleApiClient googleApiClient; 
    private Location mCurrentLocation; 
    private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi; 

    public FusedLocationService(Service locationService, final long INTERVAL, final long FASTEST_INTERVAL) { 
     Logger.log(TAG, "FusedLocationService called"); 

     this.mCallBack = (OnLocationChangedListener)locationService; 

     locationRequest = LocationRequest.create(); 
     locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     locationRequest.setInterval(INTERVAL); 
     locationRequest.setFastestInterval(FASTEST_INTERVAL); 
     this.locationService = locationService; 

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

     if (googleApiClient != null) { 
      googleApiClient.connect(); 
     } 
    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
     if(mRequestingLocationUpdates) { 
      startLocationUpdates(); 
     }else{ 
      Logger.log(TAG, "Location updates are already running."); 
     } 
    } 

    protected void startLocationUpdates() { 
     this.fusedLocationProviderApi.requestLocationUpdates(
       googleApiClient, locationRequest, this); 
     this.mRequestingLocationUpdates = false; 
    } 

    @Override 
    public void onLocationChanged(Location mCurrentLocation) { 
     Logger.log(TAG, "onLocationChanged called"); 
     this.mCurrentLocation = mCurrentLocation; 
     this.mCallBack.OnLocationChanged(this.mCurrentLocation); 
    } 

    public void startLocationUpdatesAfterResume(){ 
     if (googleApiClient.isConnected() && !mRequestingLocationUpdates) { 
      Logger.log(TAG, "startLocationUpdatesAfterResume called"); 
      this.startLocationUpdates(); 
     } 
    } 

    public void stopLocationUpdates() { 
     Logger.log(TAG, "stopping Location Updates"); 
     LocationServices.FusedLocationApi.removeLocationUpdates(
       googleApiClient, this); 
    } 

    public Location getLocation() { 
     return this.mCurrentLocation; 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     this.mRequestingLocationUpdates = true; 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     this.mRequestingLocationUpdates = true; 
    } 
} 
+1

I‘ Habe ich das Problem auch gelöst, hast du das gelöst? – jzarsuelo

+0

das gleiche passiert auf meinem Nexus 7 Tablet, bitte teilen Sie die Lösung, wenn es gelöst ist, danke –

+0

Mit dem gleichen Problem, keine Position, wenn GPS aktiviert ist. Hast du dein Problem gelöst? – AAverin

Antwort

0

Sie scheinen LocationRequest.PRIORITY_HIGH_ACCURACY zu verwenden, die GPS oben und gegenüber anderen Verfahren bevorzugt verwendet wird. Vielleicht möchten Sie PRIORITY_BALANCED_POWER_ACCURACY verwenden, die WiFi und Mobilfunkmasten verwenden wird, bevor Sie GPS verwenden.

Da auch PRIORITY_BALANCED_POWER_ACCURACY eine "grobe" Genauigkeitsstufe ist, möchten Sie möglicherweise die Standorterlaubnis in Ihrem Manifest entsprechend ändern.

Details Weitere Informationen über die Prioritätsflags, möchten Sie vielleicht auch durchgehen.

+1

Nun, ich habe das definitiv versucht. Ich erhalte jedoch keinen Standort, wenn ich PRIORITY_BALANCED_POWER_ACCURACY verwende. –

+0

Testen Sie auf einem Emulator oder einem Gerät? – Abhishek

+0

Ich teste auf einem Gerät. Um zu klären, bekomme ich keinen Ort, wenn ich kein GPS habe. –

2

Ich denke, ich habe die Lösung des Problems gefunden.

Wenn Sie zu Einstellungen -> Privatsphäre und Sicherheit -> Standort gehen, würden Sie feststellen, dass Standort nicht nur GPS ist, sondern es den Benutzer tatsächlich entscheiden lässt, welche Anbieter verwendet werden können. Sie können z. B. festlegen, dass nur WLAN und Mobilfunk zum Abrufen von Standorten verwendet werden.

Die Option Standort deaktivieren deaktiviert alle Anbieter auf einmal, nicht nur GPS.

Um zu testen, dass die App für Benutzer mit nur WiFi einen Standort bekommen kann - ändern Sie die Einstellung auf "Wifi + Cellular".

5

Ich hatte das gleiche Problem wie Sie, das ist überhaupt kein Problem. Android hatte früher eine GPS-Taste, mit der Sie es direkt steuern konnten, aber sie ersetzten es durch eine Standorttaste, die anders funktioniert. Um einen beliebigen Standort zu erhalten, müssen Sie ihn aktivieren. Wie Sie, dachte ich, die Schaltfläche "Standort" schaltet das GPS nur ein und aus, aber das ist nicht der Fall. Sie können die GPS-Steuerung durch den Ortungsmodus zu ändern: 1. hohe Genauigkeit (GPS, Wi-Fi und Mobilfunknetze) 2. Energiespar (Wi-Fi und Mobilfunknetze) 3. GPS nur

+0

Ich denke, diese Antwort löst die Verwirrung zwischen Standort und GPS. –