2016-10-18 5 views
0

나는 안드로이드 개발에 대한 새로운이야 15 초마다 같은 좌표를 가져오고 서버에 결과를 보낼 필요가 같은 사용자 상호 작용없이 백그라운드 서비스에서 GPS 위치를 얻을 필요가 어떻게 내가 이것을 얻을 수 있습니다. 그럼 내가 융합 위치 API를 syncadapter combination.It 작동, 좌표를 받고 있어요하지만 전용 안드로이드 서비스에서 해당 위치 클래스를 사용해야합니다 어떻게하면이 서비스를 실행하게 15 분 동안 좌표를 가져오고 보내려면이 필요를 달성 할 수 있습니다 서버에 대한 결과로 내 Google API 클라이언트 클래스를 게시 할 수있게되었습니다. 아래 코드를 시도해 보았습니다.백그라운드 서비스에서 융합 위치를 사용하여 GPS 업데이트 받기 전 (15 분) 동안?

그것은 syncadapter에서 작동
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(); 
    } 
} 

하지만 난 사용자가 사전에 네트워크 위치 업데이트 덕분에이를 수 있습니다 내가 어떻게이 얻을 수있는 위치는 GPS의 전원을 끌 경우 내가이 또 다른 의심을 달성 할 수있는 방법을 서비스에서이 문제를 확인해야합니다!

+0

배치하는 예를 https://stackoverflow.com/questions/39314901/getting-latitude-and-longitude-in-30-seconds/39315097#39315097 – Saveen

답변

0

AlarmManager를 사용하여 가능한 한 빨리 장비를 깨우고 위치를 수신 한 다음 (15 분 간격으로) 잠자기를 계속하는 것이 좋습니다. 따라서이 방법은 논스톱 서비스보다 좋습니다.

사용자가 GPS를 끄면 여전히 위치 설정으로 인해 (네트워크 제공 업체) 위치 업데이트가 표시되지만 정확하지 않을 수 있습니다. 위치 서비스에 요청을 할 때 또한이 문제를 해결하기 위해, 당신은 SettingsApi

을 사용할 수 있습니다, 장치의 시스템 설정은 필요한 위치 데이터를 획득하는 응용 프로그램을 방지하는 상태 일 수 있습니다. 예를 들어, GPS 또는 Wi-Fi 스캐닝이 꺼져있을 수 있습니다.

여기
+0

사용자의 힘이 응용 프로그램을 중지하면 자동으로 다시 시작됩니다 무엇 –

+0

아니요. 사용자가 앱을 강제 종료하면 자동으로 다시 시작되지 않습니다. 사용자는 명시 적으로 앱을 다시 시작해야합니다. –

+0

@DavidWasser의 대답이 맞습니다. 또한 장치를 부팅 한 후 알람을 다시 예약해야합니다. – Blackkara