Как отправить местоположение устройства на сервере, когда это необходимо

Я разрабатываю приложение, в котором мне нужен текущий lat и long устройства. Временные рамки для получения lat / long будут определены сервером. Сервер будет отправлять уведомления всякий раз, когда lat/lang требуется для извлечения. При устройстве вам будет сообщено с сервер,в то же время отправить свое местоположение на сервер.

условия:

  • Я хочу lat / long, даже если устройство не имеет gps

  • если пользователь не касается или нажмите уведомление,а затем я также хочу получить lat / long, т. е. даже если устройство находится в спящем режиме.

  • также я не хочу запускать фоновую службу в течение всего дня, как он потребляет батарею устройства.

2 ответов


я бы посоветовал использовать Google Cloud Messaging здесь. Это имеет то преимущество, что, как только устройство запускает ваше приложение, вы можете зарегистрировать его против GCM и вы можете отправить им сообщение, которое заставит их зарегистрировать свои координаты в вашей базе данных.

этот подход потребует, чтобы вы реализовали какой-то сервер (например, веб-сервер с PHP) и заставили пользователей общаться с ним, поэтому поток будет:

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

  2. устройства получают сообщение, и вы реализуете BroadcastReceiver чтобы получить широту и долготу и отправить его на удаленный сервер, скажем http://www.mysuperserver.com/getlonglat.php, через POST запрос.

  3. ваш сервер принимает оба параметра, и вы сохраняете их или делаете все, что вам нужно.

если вы хотите следовать этому подход, это шаги, которые вы должны следовать:

  1. на https://console.developers.google.com. С вашим аккаунтом Google, зарегистрировать новый проект. Это предоставит вам ключ API и идентификатор отправителя.

  2. вам нужно будет зарегистрировать устройство против вашего проекта в GCM. Вы можете достичь этого, импортировав Google Play Services внутри вашего проекта, и как только сделано, сделайте что-то похожее на это:

    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
    final String regid = gcm.register("YOUR_SENDER_ID");
    
  3. в это время GCM сервер уже знает, что данный пользователь зарегистрировался в вашем проекте и дал ему regid.

  4. следующим шагом является информирование вашего собственного удаленного сервера о том, что пользователь сделал это, и сохранить где-то regid что было дано, так что вы можете позже отправить им сообщения. Поэтому на стороне клиента сделайте HTTP POST запрос к серверу посылает, что regid и процесс его с somethat такой:

    $regid = $_POST['regid'];
    
    if (($regId) && ($ipAddr))
      sql_query("INSERT INTO gcm_subscribers(regid) VALUES($regid')");
    
  5. после завершения, вы знаете, кто уже зарегистрировался в вашей базе данных. Ты можешь!--16--> все пользователи и отправить им сигнал, чтобы отправить вам обратно свои координаты. В следующем примере параметры будут, во-первых, массив идентификаторов регистрации и, во-вторых, сообщение для отправки (например,$messageData = "sendMeYourCoords!").

    function sendNotification($registrationIdsArray, $messageData) {
      $apiKey = "YOUR_API_KEY";
    
      $headers = array("Content-Type:" . "application/json", "Authorization:" . "key=" . $apiKey);
      $data = array(
        'data' => $messageData,
        'registration_ids' => $registrationIdsArray
      );
    
      $ch = curl_init();
    
      curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
      curl_setopt( $ch, CURLOPT_URL, "https://android.googleapis.com/gcm/send" );
      curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
      curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
      curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
      curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($data) );
    
      $response = curl_exec($ch);
      curl_close($ch);
    
      return $response;
    }
    
  6. Однажды в вашем клиенте, просто обработайте это GCM сообщения и сделать другой POST в другой URL на вашем удаленном сервере и передайте его longitude и latitude. Для обработки сообщений я включаю несколько ссылок ниже.

и для получения координат без GPS, кажется, не слишком много решений, но есть некоторые. Вот пример:как получить значение долготы Latitute без использования GPS в Android?

подробнее об этом:


вот что я сделал.

  1. Fetch и хранить местоположения с помощью Google Play services fused location provider, как описано здесьздесь

  2. Я бы избегал настройки службы, вместо этого вы должны вызвать сигнал тревоги, который запрашивает последнее доступное местоположение. Это дополнительно экономит батарею, поскольку приложение не ищет местоположение vale, но использует то, что другие приложения могли недавно запросить. На мой взгляд полученное реакция довольно точная.. так сделайте что-нибудь вроде этого

    public class LocationReceiver extends BroadcastReceiver {
    // Restart service every 30 seconds
    private static final long REPEAT_TIME = 1000 * 60 * 5;
    private static final long REPEAT_DAILY = 1000 * 60 * 60 * 24;
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        Log.v("TEST", "Service loaded at start");
        AlarmManager service = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.SECOND, 0);
    
        Intent i = new Intent(context, ServiceStartReceiver.class);
        PendingIntent pending = PendingIntent.getBroadcast(context, 0, i,PendingIntent.FLAG_CANCEL_CURRENT);
        service.setInexactRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), REPEAT_TIME, pending);
    
    }
    }
    
  3. поскольку вы не упомянули, что хотите обновления в режиме реального времени, я думаю, вы можете просто сбросить все данные в базу данных temp sqlite.

  4. создать приемник для отслеживания изменений в сети и когда через WiFi просто отправить все данные на сервер. Вы можете быть немного умнее, делая это, отправляя только тогда, когда определенное количество записей накопилось или на периодическом интервал.

  5. в качестве альтернативы сервер может отправить пинг в приложение через GCM mnotification, который также может вызвать отправку данных на ваш сервер.этой это удивительный учебник для описания отправки сообщений GCM в приложение.

  6. Наконец, некоторые очень интересные стратегии местоположения упоминаются здесь. Вы можете пос, когда, чтобы вызвать ваше местоположение сохранить на основе активности пользователя или какой-либо другой контекст.

надеюсь, что это помогает.