2016-10-18 4 views
0

Ich bin neu für Android-Entwicklung müssen GPS-Standort im Hintergrund Service ohne Benutzerinteraktion wie für alle 15 Minuten müssen die Koordinaten abrufen und senden Sie die Ergebnisse an den Server, wie kann ich dies erreichen. Dann versuchte ich fusionierte Standort api syncadapter Kombination. Es funktioniert, ich bekomme Koordinaten, aber ich muss diese Standortklasse im dedizierten android-Dienst verwenden, wie ich dieses Bedürfnis erreichen kann, diesen Dienst zu machen, laufen Sie für immer 15 Minuten, holen Sie die Koordinaten und senden Sie das Ergebnis zum Server lassen Sie mich meine Google API-Client-Klasse veröffentlichen.Bitte überprüfen Sie unten Code, den ich versucht habe.GPS-Updates mit fusioniertem Standort im Hintergrund-Service erhalten Für zB (15 Min.)?

import android.content.Context; 
import android.location.Location; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.util.Log; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GooglePlayServicesUtil; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.common.api.PendingResult; 
import com.google.android.gms.common.api.Status; 
import com.google.android.gms.location.FusedLocationProviderApi; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 

import java.text.DateFormat; 
import java.util.Date; 

/** 
* Created by 4264 on 14-10-2016. 
*/ 

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


    LocationRequest mLocationRequest; 
    GoogleApiClient mGoogleApiClient; 
    Location mCurrentLocation; 
    String mLastUpdateTime; 
    private Context context; 
    private static final long INTERVAL = 1000 * 10; 
    private static final long FASTEST_INTERVAL = 1000 * 5; 
    public Locationlistener(Context c) 
    { 
     context=c; 
     //show error dialog if GoolglePlayServices not available 
     createLocationRequest(); 
     mGoogleApiClient = new GoogleApiClient.Builder(context) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 
     mGoogleApiClient.connect(); 
    } 
    protected void createLocationRequest() { 
     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(INTERVAL); 
     mLocationRequest.setFastestInterval(FASTEST_INTERVAL); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    } 
    public String lat(){ 
     String lat=null; 
     if(mCurrentLocation==null){ 
      Log.d("is null","null"); 
     } 
     else { 
      lat=String.valueOf(mCurrentLocation.getLatitude()); 
     } 
     return lat; 
    } 

    protected void startLocationUpdates() { 
     PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(
       mGoogleApiClient, mLocationRequest, this); 
     Log.d("started", "Location update started ..............: "); 
    } 
    public void updateUI() { 
     Log.d("updated", "UI update initiated ............."); 
     if (null != mCurrentLocation) { 
      String lat = String.valueOf(mCurrentLocation.getLatitude()); 
      String lng = String.valueOf(mCurrentLocation.getLongitude()); 
      Log.e("latw",lat); 
      Log.e("Long",lng); 

     } else { 
      Log.d("", "location is null ..............."); 
     } 
    } 


    @Override 
    public void onConnected(Bundle bundle) { 
     Log.d("connected", "onConnected - isConnected ...............: " + mGoogleApiClient.isConnected()); 
     startLocationUpdates(); 
    } 


    @Override 
    public void onConnectionSuspended(int i) { 

    } 




    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
     Log.d("failed", "Connection failed: " + connectionResult.toString()); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     Log.d("locationchanged", "Firing onLocationChanged.............................................."); 
     mCurrentLocation = location; 
     mLastUpdateTime = DateFormat.getTimeInstance().format(new Date()); 
     updateUI(); 
    } 
} 

Es in SyncAdapter funktioniert, aber ich brauche diese in Dienst zu machen, wie ich diese und andere Zweifel erreichen können, wenn Anwender die GPS ausschalten, wie ich Standort bekommen es mit Netzwerk-Standortaktualisierungen Dank im Voraus möglich ist !!

+0

Posted Beispiel hier https://stackoverflow.com/questions/39314901/getting-latitude-and-longitude-in-30-seconds/39315097#39315097 – Saveen

Antwort

0

Ich würde vorschlagen, AlarmManager zu verwenden, um das Gerät zu aktivieren und den Standort so bald wie möglich zu empfangen (Intervall 0), und dann alle 15 Minuten zu schlafen. Also dieser Ansatz besser als Non-Stop-Service.

Wenn der Benutzer den GPS ausschaltet, erhalten Sie immer noch (Netzwerkanbieter) Standortaktualisierungen, die aufgrund der Standorteinstellungen jedoch nicht korrekt sind. Auch dieses Problem zu lösen, können Sie SettingsApi

verwenden Wenn eine Anfrage an den Ortungsdienste machen, die Systemeinstellungen des Geräts in einem Zustand sein, der eine App Erhalten die Standortdaten verhindert, die es braucht. Zum Beispiel kann GPS- oder WLAN-Scannen ausgeschaltet sein.

+0

Was ist, wenn Kraft Benutzer die App beenden wird es automatisch neu gestartet –

+0

Nein. Wenn der Benutzer die App anhält, wird er nicht automatisch neu gestartet. Der Nutzer muss die App explizit erneut selbst starten. –

+0

@DavidWassers Antwort ist korrekt. Auch nach dem Booten des Geräts muss der Alarm erneut geplant werden. – Blackkara

Verwandte Themen