2012-02-23 2 views
9

Мне нужно отправить текущие данные о местоположении (lat & long) на сервер периодически (пример: каждые 5 минут). Есть ли лучший способ? Я знаю, как получить текущее местоположение &, как отправить информацию на сервер. Но как я повторяю это через периодические промежутки времени?Отправить текущее местоположение на сервере периодически в android

+1

Пожалуйста, проверьте это, похожее приложение и отлично работает, но мне нужна помощь в отношении некоторых функций, которые вы узнаете после прочтения моего сообщения, и извините за то, что поставили эту вещь в ответ, поскольку я могу, вариант комментария. . http://stackoverflow.com/questions/14088095/how-can-i-send-the-gps-and-network-location-cordinates-to-a-server-static-ip/14103445#14103445 – user2010282

ответ

9

Зарегистрируйте будильник с помощью AlarmManager, чтобы проснуться через 5 минут, когда пользователь впервые откроет приложение. создать службу (выбрать местоположение и обновить сервер), чтобы запустить, когда будильник уведомляет ваше приложение. После того, как сервис завершит работу, снова войдите в тревогу, чтобы проснуться через 5 минут. таким образом, вы можете достичь своей задачи.

исх

Android: How to periodically send location to a server

http://developer.android.com/reference/android/app/AlarmManager.html

http://developer.android.com/reference/android/app/Service.html

первый Edit - Добавление кода образца

Шаг 1 - Создание управляющего сигнала и зарегистрировать тревогу

AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

Intent intent = new Intent(Main.this, YourWakefulReceiver.class); 
bool flag = (PendingIntent.getBroadcast(Main.this, 0, 
       intent, PendingIntent.FLAG_NO_CREATE)==null); 
/*Register alarm if not registered already*/ 
if(flag){ 
PendingIntent alarmIntent = PendingIntent.getBroadcast(Main.this, 0, 
        intent, PendingIntent.FLAG_UPDATE_CURRENT); 

// Create Calendar obj called calendar 

/* Setting alarm for every one hour from the current time.*/ 
int intervalTimeMillis = 1000 * 60 * 60; // 1 hour 
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, 
         calander.getTimeInMillis(), intervalTimeMillis, 
         alarmIntent); 
} 

Шаг 2 - Создание класса Receiver

public class YourWakefulReceiver extends WakefulBroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
      Intent service = new Intent(context, SimpleWakefulService.class); 
      startWakefulService(context, service); 
     } 
    } 
} 

Setp 3 - Создание класса Service

public class YourService extends IntentService { 

    private static String tagName = "YourService"; 

    public SimpleWakefulService() { 
     super("YourService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     // Start your location 
     LocationUtil.startLocationListener(); 
     try { 
     // Wait for 10 seconds 
      Thread.sleep(1000*10); 
     } catch (InterruptedException e) { 
     } 
     //Stop location listener 
     LocationUtil.stopLocationListener(); 
     // upload or save location 
     uploadGps(); 

     SimpleWakefulReceiver.completeWakefulIntent(intent); 
    } 

} 

Шаг 4 - Регистрация службы и приемник

<service android:name="com.envision.ghari.services.YourService"></service> 
     <receiver android:name="com.envision.ghari.receivers.YourWakefulReceiver"></receiver> 

Примечание: Этот код заключается в понимании реализации. Он не будет компилироваться.

+2

Я желаю этого ответ был немного более близок. –

+0

также добавить проверку доступности сети.Если сеть недоступна, сохраните координаты локально и отправьте их на сервер, когда сеть там – Harsh

+0

, вероятно, лучший способ начать. –

0

Поскольку для этого не требуется взаимодействие с пользовательским интерфейсом, для этого вам необходимо создать сервис, служба будет вызывать метод requestLocationUpdates, в этом методе пропустить минимальное время параметра до 5 минут.

1

Использование BroadcastReceiver является хорошим выбором для отправки периодических запросов.

Here - это учебник по использованию BroadcastReceiver.

1

Лучший способ разбудить услугу с помощью AlarmManager и разместить местоположение, которое вы получаете на сервере.

0

Я разрабатываю приложение, которое получает позицию сотового телефона весь день в течение 10 и 15 секунд в службе, оно отлично работает, но иногда метод OnLocationChanged из прослушивателя провайдера сети перестает быть вызванным.

import android.location.Address; 
    import android.location.Geocoder; 
    import android.support.v7.app.AppCompatActivity; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.AdapterView; 
    import android.widget.ListView; 
    import android.widget.SimpleCursorAdapter; 
    import android.widget.TextView; 


    import java.io.IOException; 
    import java.util.List; 

    import foodinn.databases.LocationUpdaterDatabase; 

    public class LocationUpdatesActivity extends AppCompatActivity { 
     private LocationUpdaterDatabase locationUpdaterDatabase; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_location_updates); 

      locationUpdaterDatabase = new LocationUpdaterDatabase(this, "Locations.db", null, 1); 

      final Geocoder geocoder = new Geocoder(this); 

      ListView listView = (ListView) findViewById(R.id.locationUpdatesListView); 

      listView.setAdapter(new SimpleCursorAdapter(this, R.layout.location_updates_list_view_view, locationUpdaterDatabase.getLocationUpdates(), new String[] {"latitude", "longitude", "whenUpdated"}, new int[] {R.id.listViewTextView1, R.id.listViewTextView2, R.id.listViewTextView3}, SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER)); 

      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
        double latitude = Double.valueOf(((TextView) view.findViewById(R.id.listViewTextView1)).getText().toString()); 
        double longitude = Double.valueOf(((TextView) view.findViewById(R.id.listViewTextView2)).getText().toString()); 

        try { 
         List<Address> addressList = geocoder.getFromLocation(latitude, longitude, 1); 

         String address = addressList.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex() 
         String city = addressList.get(0).getLocality(); 
         String state = addressList.get(0).getAdminArea(); 
         String country = addressList.get(0).getCountryName(); 
         String postalCode = addressList.get(0).getPostalCode(); 
         String knownName = addressList.get(0).getFeatureName(); 

         ((TextView) view.findViewById(R.id.listViewTextView4)).setText(address + ", " + city + ", " + country); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
     } 
    } 
+0

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http: //meta.stackexchange .com/questions/114762/explaining-whole-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. –

Смежные вопросы