2016-10-18 5 views
0

Я новичок в разработке Android для того, чтобы получить местоположение gps в фоновом режиме без взаимодействия с пользователем, так как каждые 15 минут нужно получить координаты и отправить результаты на сервер, как я могу это достичь. Затем я попытался скомпоновать соединение api syncadapter. Он работает, я получаю координаты, но мне нужно использовать этот класс местоположения в специальном андроид-сервисе, как я могу достичь этой потребности, чтобы этот сервис выполнялся навсегда 15 минут, чтобы получить координаты и отправить этот результат на сервер позволяет мне опубликовать мой клиентский класс api. Пожалуйста, проверьте ниже код, который я попробовал.Получение обновлений GPS с использованием плавного расположения в фоновом режиме Для ex (15 минут)?

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(); 
    } 
} 

Он работает в SyncAdapter, но мне нужно сделать это в службе, как я могу добиться этого и другое сомнение, если пользователь отключить GPS, как я могу получить местоположение можно с обновлениями сетевого расположения заранее спасибо !!

+0

Опубликовано пример здесь https://stackoverflow.com/questions/39314901/getting-latitude-and-longitude-in-30-seconds/39315097#39315097 – Saveen

ответ

0

Я предлагаю вам использовать AlarmManager для быстрого пробуждения устройства и получения местоположения как можно скорее (интервал 0), а затем продолжать спать каждые 15 минут. Таким образом, этот подход лучше, чем безостановочный сервис.

Если пользователь отключает GPS, вы все равно будете получать обновления местоположения сетевого провайдера, но не точно из-за настроек местоположения, являются недостаточными. Кроме того, чтобы решить эту проблему, вы можете использовать SettingsApi

При запрос на место службы, настройка системы устройства может находиться в таком состоянии, что предотвращает приложение от получения данных о местоположении, что ему необходимо. Например, сканирование GPS или Wi-Fi может быть отключено.

+0

Что делать, если пользователь силы остановить приложение будет автоматически перезагружать –

+0

Нет. Если пользовательская сила останавливает приложение, он не будет автоматически перезагружаться. пользователь должен явно запустить приложение снова сам. –

+0

Ответ @DavidWasser правильный. Также после загрузки устройства будильник должен быть запланирован снова. – Blackkara