3

퓨전 위치 제공기 API의 일괄 처리 된 버전으로 백그라운드에서 위치 업데이트를 얻으려고합니다.안드로이드 배치에서 위치 업데이트를 얻는 방법

브로드 캐스트로 콜백으로 위치 업데이트를 요청하여 Google 가이드 라인을 준수하여이 작업을 수행하고 있습니다. PendingIntent.

위치 요청의 경우 Google API 설명서에서 특정 위치에 배치 된 위치 업데이트 결과를 얻기 위해 setMaxWaitTime을 사용했습니다.

내 문제는 내 브로드 캐스트 수신기가 위치를 일괄 적으로받지 못하고 위치 서비스에서 한 번에 하나의 위치를 ​​얻는다는 것입니다.

Google에서 새 PendingIntent location update sample project을 시도했지만 위치 업데이트는 한 번에 하나의 위치 만 반환합니다.

정보 Nexus 5X 기기에서 테스트 한 내용은 batching sensor hardware입니다.

내가 누락 된 항목이 있습니까?

빌드와 연결 구글 API 클라이언트

private static final long UPDATE_INTERVAL = 60000; // Every 60 seconds. 
private static final long FASTEST_UPDATE_INTERVAL = 30000; // Every 30 seconds 
private static final long MAX_WAIT_TIME = 60000 * 5; // Batch every 5 minutes. 

public void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(context) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 

    mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(UPDATE_INTERVAL); 
    mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
    mLocationRequest.setMaxWaitTime(MAX_WAIT_TIME); 

    mGoogleApiClient.connect(); 
} 

@Override 
public void onConnected(Bundle connectionHint) { 
    try { 
     // Create a pending intent to listening on location service when the update become available 
     Intent mIntent = new Intent(context, LocationReceiver.class); 
     mPendingIntent = PendingIntent.getBroadcast(context, 42, mIntent, PendingIntent.FLAG_CANCEL_CURRENT); 
     // Permission check before launching location services 
     if (ContextCompat.checkSelfPermission(context, 
       Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      return; 
     } 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mPendingIntent); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

브로드 캐스트 리시버 클래스

public class LocationReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(final Context context, Intent intent) { 
    try { 

     // Check if intent has location result 
     if (LocationResult.hasResult(intent)) { 
      // Get our location from the LocationResult 
      LocationResult locationResult = LocationResult.extractResult(intent); 
      if (locationResult != null) { 

       List<Location> locations = locationResult.getLocations(); 

       for (Location location : locations) { 
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.FRANCE); 
        String dateString = formatter.format(new java.util.Date(location.getTime())); 

        Log.d(TAG, "LOCATION: lat:" + location.getLatitude() + " long:" + location.getLongitude() + 
          " radius:" + location.getAccuracy() + " date:" + dateString); 
       } 

      } else { 
       Log.d(TAG, "Location is null"); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

} 어떤 도움

감사 : 여기

는 코드의 예입니다.

답변

1

며칠 동안 테스트 한 후 위치 일괄 처리가 내 코드와 함께 작동하는 것으로 보입니다.

저는 일괄 처리를 위해 휴대 전화로 이동해야한다는 것을 알았지 만 무작위입니다. 일부 시간 위치 업데이트가 지연되고 일괄 처리가 전달되며 언젠가 한 위치 만 제공됩니다.

+0

이 메타 게시물을 살펴보십시오. https://meta.stackoverflow.com/questions/356451/reminding-people-to-pay-attention-and-use-skip-when-reviewing –