2016-11-11 2 views
0

Я новичок в android Я хочу запустить службу в фоновом режиме и получить широту и долготу или Geo-адрес через 10 минут и отправить на сервер.Не получать широту и долготу от фоновой службы

Пожалуйста, помогите мне.

Вот мой код:

В деятельности

public void serviceCall(){ 
    Log.e("INSIDE ALARM", "INSIDE ALARM"); 
    Intent intent = new Intent(getApplicationContext(), MyService.class); 
    final PendingIntent pIntent = PendingIntent.getBroadcast(this, MyService.REQUEST_CODE, 
       intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    long firstMillis = System.currentTimeMillis(); 
    AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
    alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstMillis, 
       6000, pIntent); 
} 

в Reciver

public static final int REQUEST_CODE = 9411; 

@Override 
public void onReceive(Context context, Intent intent) { 
    Intent inti = new Intent(context, LocationService.class); 
    intent1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK |Intent.FLAG_ACTIVITY_CLEAR_TOP |Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startService(inti); 
} 

в IntentService

protected void onHandleIntent(Intent intent) { 
    Log.e("imsidehandler Service", ":="); 
    mRequestingLocationUpdates = false; 
    buildGoogleApiClient(); 
    createLocationRequest(); 
    buildLocationSettingsRequest(); 
    checkLocationSettings(); 
    sendDataServer(); 
} 

public void onConnected(Bundle bundle) { 
    if (mCurrentLocation == null) { 
    mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
    mLastUpdateTime = DateFormat.getTimeInstance().format(new Date()); 
    updateLocationUI(); 
    } 
} 

public void onConnectionSuspended(int i) { 

} 

public void onLocationChanged(Location location) { 
    mCurrentLocation = location; 
    mLastUpdateTime = DateFormat.getTimeInstance().format(new Date()); 
} 

public void onConnectionFailed(ConnectionResult connectionResult) { 

} 

private synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
} 

private void createLocationRequest() { 
    mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); 
    mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
} 

private void buildLocationSettingsRequest() { 
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); 
    builder.addLocationRequest(mLocationRequest); 
    mLocationSettingsRequest = builder.build(); 
} 

private void checkLocationSettings() { 
    PendingResult<LocationSettingsResult> result = 
      LocationServices.SettingsApi.checkLocationSettings(
        mGoogleApiClient, 
        mLocationSettingsRequest 
      ); 
    result.setResultCallback(this); 
} 

protected boolean startLocationUpdates() { 
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, 
      android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     return true; 
    } 

    return false; 
} 

protected void stopLocationUpdates() { 
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, (com.google.android.gms.location.LocationListener) this).setResultCallback(new ResultCallback<Status>() { 
     @Override 
     public void onResult(Status status) { 
      mRequestingLocationUpdates = false; 
     } 
    }); 
} 

private void updateLocationUI() { 
    if (mCurrentLocation != null) { 
    updateCityAndPincode(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude()); 

    } 
} 

private void updateCityAndPincode(double latitude, double longitude) { 
    try { 
    Log.e("latitude","==>"+longitude); 
    Log.e("longitude","==>"+longitude); 
    this.latitude = latitude; 
    this.longitude = longitude; 
    getGeoAddress(latitude, longitude); 
    } catch (Exception e) { 
    } 

} 

private void getGeoAddress(Double latitude, Double longitude) { 
    Geocoder geocoder = new Geocoder(this, Locale.getDefault()); 
    String result = null; 
    List<Address> addressList = null; 
    try { 
    addressList = geocoder.getFromLocation(
       latitude, longitude, 1); 

     if (addressList != null && addressList.size() > 0) { 
     Address address = addressList.get(0); 
     Log.e("address","==>"+address); 
     for (int i = 0; i < address.getMaxAddressLineIndex(); i++) { 
      result += address.getAddressLine(i); 
      result += " "; 
     } 
     if (result.contains("null")) { 
      result1 = result.replace("null", ""); 
     } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 

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

      startLocationUpdates(); 

      break; 
     case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
      try { 
       status.startResolutionForResult((Activity) getApplicationContext(), REQUEST_CHECK_SETTINGS); 
      } catch (IntentSender.SendIntentException e) { 
      } 
      break; 
     case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
      break; 

    } 
} 

пожалуйста, помогите мне

+0

Какая проблема? Не работает ли служба на основе механизма таймера на основе AlarmManager? Или он запускается, но вы просто не получили правильное местоположение? –

ответ

0

Метод getLastLocation() просто получает последнее известное местоположение, что устройство происходит знать. Иногда устройство не «узнает» его местоположение и возвращается null.

Устройство не определяет свое местоположение самостоятельно, но только в том случае, если какое-либо приложение запрашивает местоположение. Таким образом, ваше приложение теперь зависит от других приложений, запрашивающих обновления местоположения.

Также «последнее известное местоположение» означает именно это: оно может быть не актуальным. В местоположениях есть метка времени, которая может использоваться для оценки того, может ли местоположение быть релевантным.

Я не вижу звонка requestLocationUpdates() в любом месте вашего кода. Это потребовало бы обновления актуальных обновлений местоположения с интервалом, который вы можете указать.

Ваш метод onConnected() может иметь:

public void onConnected(Bundle bundle) {  
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
} 

(getLastLocation() вызов может быть удален.)

И ваш IntentService может реализовать LocationListener и делать то же самое, как onConnected() теперь делает, но только после того, обновление местоположения прибыло:

@Override 
public void onLocationChanged(Location location) { 
    // Cancel the updates after the first one: 
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 

    mCurrentLocation = location; 
    mLastUpdateTime = DateFormat.getTimeInstance().format(new Date()); 
    updateLocationUI(); 

} 

Это был бы путь запрашивать и обрабатывать обновления местоположения с минимальными изменениями кода.

Конечно, есть и другие способы, например, запрашивать обновления каждые 10 минут и обрабатывать их через PendingIntent. Там же this version of requestLocationUpdates(), что берет PendingIntent:

public abstract PendingResult<Status> requestLocationUpdates (GoogleApiClient client, LocationRequest request, PendingIntent callbackIntent) 

Это будет заменить текущий механизм таймера.