1

getLastLocation() gibt NULL zurück, während Telefonstandort auf meinem 6.0 Nexus 7 Tablet ausgeschaltet ist, aber es funktioniert ohne GPS auf einem anderen Gerät. Warum ist es so und irgendwie, es zu lösen? Ich möchte das GPS deaktivieren und einfach das Netzwerk verwenden, um den Standort zu ermitteln.Android: Google Fused Location funktioniert nicht, während der Standort ausgeschaltet ist

Unten ist die Klasse-I-Standort erhalten bin mit:

public class GPSCenter { 
public static GoogleApiClient mGoogleApiClient; 
public static Location mLastLocation; 
private static Context mContext; 

static GoogleApiClient.ConnectionCallbacks ccb = new GoogleApiClient.ConnectionCallbacks() { 

    @Override 
    public void onConnectionSuspended(int arg0) { 
    } 

    @Override 
    public void onConnected(Bundle arg0) { 

     if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      return; 
     } 

     LocationRequest mLocationRequest = LocationRequest.create(); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_NO_POWER); 

     mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
    } 
}; 
static GoogleApiClient.OnConnectionFailedListener odfl = new GoogleApiClient.OnConnectionFailedListener() { 
    @Override 
    public void onConnectionFailed(ConnectionResult arg0) { 
    } 
}; 

public static synchronized void buildGoogleApiClient(Context c) { 
    try { 

     mContext = c; 
     mGoogleApiClient = new GoogleApiClient.Builder(c) 
       .addConnectionCallbacks(ccb) 
       .addOnConnectionFailedListener(odfl) 
       .addApi(LocationServices.API) 
       .build(); 

     mGoogleApiClient.connect(); 
    } catch (Exception ex) { 
     Log.i("location", "error " + ex.toString()); 
     ex.printStackTrace(); 
    } 
} 

public static double getLatitude(Context c) { 
    try { 
     return mLastLocation.getLatitude(); 
    } catch (Exception ex) { 
     return 0.0; 
    } 
} 

public static double getLongitude(Context c) { 
    try { 
     return mLastLocation.getLongitude(); 
    } catch (Exception ex) { 
     return 0.0; 
    } 
} 
} 
+0

Haben Sie irgendeine Lösung gefunden –

+0

@ M.Yogeshwaran ja bitte überprüfen Sie die Antwort unten :) –

Antwort

0

Es ist nicht wegen der GPS-Sache, aber die Location Settings ist noch nicht im Gerät aktiviert, es ist unter Ihrem Gerät Einstellungen> Google> Dienste> Standort oder Einstellungen> Datenschutz & Sicherheit> Standort oder nur Einstellungen > Standort Ich war verwirrt, weil die Drop-Down-Statusleiste bei einigen Geräten die GPS-Aktivierungstaste und einige die Positionserkennungsschaltfläche zeigt. Es gibt einen Weg, um die Standorteinstellungen automatisch aktivieren (ohne Benutzer-Geräteeinstellungen zu navigieren), es ist mein Problem gelöst, hoffe, es hilft Ihnen:

Nach GoogleApiClient verbunden ist, führen Sie eine Standorteinstellungen wie unten Überprüfung:

public static GoogleApiClient mGoogleApiClient; 
private static PendingResult<LocationSettingsResult> result; 
private static LocationSettingsRequest.Builder builder; 
public static Location mLastLocation; 
public static boolean isLocationON = false; 

public static synchronized void buildGoogleApiClient(Activity a, Context c) { 

    try { 

     mActivity = a; 
     mContext = c; 
     mGoogleApiClient = new GoogleApiClient.Builder(c) 
       .addConnectionCallbacks(ccb) 
       .addOnConnectionFailedListener(odfl) 
       .addApi(LocationServices.API) 
       .build(); 

     builder = new LocationSettingsRequest.Builder() 
       .addLocationRequest(locationRequest); 
     builder.setAlwaysShow(true); 

     mGoogleApiClient.connect(); 

    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

private static GoogleApiClient.ConnectionCallbacks ccb = new GoogleApiClient.ConnectionCallbacks() { 

    @Override 
    public void onConnected(Bundle arg0) { 
     checkLocationSettings(); 
    } 

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

private static void checkLocationSettings() { 

    result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build()); 

    result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 

     @Override 
     public void onResult(@NonNull LocationSettingsResult locationSettingsResult) { 
      final Status status = locationSettingsResult.getStatus(); 
      switch (status.getStatusCode()) { 
       case LocationSettingsStatusCodes.SUCCESS: 

        isLocationON = true; 

        if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
         return; 
        } 
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 

        if (mLocationSettingsListener != null) { 
         mLocationSettingsListener.onLocationON(); 
        } 

        break; 

       case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 

        isLocationON = false; 

        try { 
         // This line will check the result and prompt a dialog if the device location settings is not enabled 
         status.startResolutionForResult(mActivity, REQUEST_CHECK_SETTINGS); 

        } catch (IntentSender.SendIntentException e) { 
        } 
        break; 

       case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
        isLocationON = false; 
        // Location settings are unavailable so not possible to show any dialog now 
        if (mLocationSettingsListener != null) { 
         mLocationSettingsListener.onLocationError(); 
        } 
        break; 
      } 
     } 
    }); 
} 
+0

Dank @BeeingJK ist es möglich, dieses Zeug im Hintergrund zu betreiben –

+0

Sie können einen Dienst verwenden, um es im Hintergrund auszuführen. Ein Beispiel für Location Service [hier] (http://stackoverflow.com/a/34919769/4665578) (Ich habe es noch nie versucht), es beinhaltet die Funktion von Google Play Services Überprüfung und Standort-Update-Listener, das gleiche, was Sie tun können 'checkLocationSettings' nachdem GoogleApiClient verbunden ist, bevor der Standort angefordert wird. Aber für 'startResolutionForResult' benötigen Sie wahrscheinlich eine dialogActivity, da eine Aktivität erforderlich ist, um den Dialog aufzurufen. Um es zu vereinfachen, lege ich einfach das Zeug in eine Klasse und rufe von Aktivität, und rufen Sie zurück, wenn der Standort ON ist –

+1

@BeeingJk Aber Ihre Frage war, wie Sie den Standort ohne GPS aktivieren. Aber hier aktivieren Sie gps.is'nt es? –

0

Durch Google Api ich denke, es ist nicht möglich. Dafür müssen Sie eine API für die IP-Geolokalisierung verwenden oder Sie können MNC-Mobile-Netzwerkstandort oder MCC-Mobile-Ländercode verwenden. Es kann Ihnen helfen.

+0

danke für die Antwort, tun Sie Ihre 'nicht möglich' bedeuten 'Google Fused Location' kann Gerätestandort ohne GPS nicht bekommen? Aber es funktioniert in anderen Gerät –

0

Th folgenden erklären die keinen Ortswert Teil Rückkehr:
LocationRequest. PRIORITY_NO_POWER:

keine Stellen zurückgegeben werden, es sei denn ein anderer Client Standortaktualisierungen in diesem Fall diese Anforderung als passive Zuhörer diesen Stellen angefordert hat fungieren.

Für FusedLocationProvider,

no explicitly unique source is specified anywhere within documentation.

Um den Standort zu erhalten, ohne GPS zu aktivieren, können Sie vertrauen PRIORITY_BALANCED_POWER_ACCURACY. Von dem, was ich beobachtet habe, verwendet nur PRIORITY_HIGH_ACCURACY GPS in einer obligatorischen Art und Weise.

Ein Tablet könnte nur WLAN-fähig sein oder keine SIM haben, die im Gegensatz zu anderen Geräten das Szenario des Standorts, das von anderen Apps erhalten wird, ausschließt - vielleicht über das Netzwerk.

+0

danke für Ihre Erklärung, ich habe 'PRIORITY_NO_POWER' mit' PRIORITY_BALANCED_POWER_ACCURACY' ersetzt, aber immer noch das Tablet NULL zurückgeben, wenn seine Position ausgeschaltet ist, irgendeine Idee darüber? –

0

Sie müssen die Positionsgenauigkeit im Emulator auf "Nur Gerät" einstellen. Hohe Genauigkeit oder Batteriesparen funktioniert nicht mit FusedLocationProviderApi im Emulator.

Verwandte Themen