Как отправить местоположение устройства на сервере, когда это необходимо
Я разрабатываю приложение, в котором мне нужен текущий lat и long устройства. Временные рамки для получения lat / long будут определены сервером. Сервер будет отправлять уведомления всякий раз, когда lat/lang требуется для извлечения. При устройстве вам будет сообщено с сервер,в то же время отправить свое местоположение на сервер.
условия:
Я хочу lat / long, даже если устройство не имеет gps
если пользователь не касается или нажмите уведомление,а затем я также хочу получить lat / long, т. е. даже если устройство находится в спящем режиме.
также я не хочу запускать фоновую службу в течение всего дня, как он потребляет батарею устройства.
2 ответов
я бы посоветовал использовать Google Cloud Messaging
здесь. Это имеет то преимущество, что, как только устройство запускает ваше приложение, вы можете зарегистрировать его против GCM
и вы можете отправить им сообщение, которое заставит их зарегистрировать свои координаты в вашей базе данных.
этот подход потребует, чтобы вы реализовали какой-то сервер (например, веб-сервер с PHP) и заставили пользователей общаться с ним, поэтому поток будет:
ваш сервер отправляет широковещательное сообщение для всех зарегистрированных устройств, сообщающее им, что они должны зарегистрироваться против
GCM
сервис.устройства получают сообщение, и вы реализуете
BroadcastReceiver
чтобы получить широту и долготу и отправить его на удаленный сервер, скажемhttp://www.mysuperserver.com/getlonglat.php
, черезPOST
запрос.ваш сервер принимает оба параметра, и вы сохраняете их или делаете все, что вам нужно.
если вы хотите следовать этому подход, это шаги, которые вы должны следовать:
на https://console.developers.google.com. С вашим аккаунтом Google, зарегистрировать новый проект. Это предоставит вам ключ API и идентификатор отправителя.
-
вам нужно будет зарегистрировать устройство против вашего проекта в
GCM
. Вы можете достичь этого, импортировавGoogle Play Services
внутри вашего проекта, и как только сделано, сделайте что-то похожее на это:GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); final String regid = gcm.register("YOUR_SENDER_ID");
в это время
GCM
сервер уже знает, что данный пользователь зарегистрировался в вашем проекте и дал емуregid
.-
следующим шагом является информирование вашего собственного удаленного сервера о том, что пользователь сделал это, и сохранить где-то
regid
что было дано, так что вы можете позже отправить им сообщения. Поэтому на стороне клиента сделайтеHTTP POST
запрос к серверу посылает, чтоregid
и процесс его с somethat такой:$regid = $_POST['regid']; if (($regId) && ($ipAddr)) sql_query("INSERT INTO gcm_subscribers(regid) VALUES($regid')");
-
после завершения, вы знаете, кто уже зарегистрировался в вашей базе данных. Ты можешь!--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; }
Однажды в вашем клиенте, просто обработайте это
GCM
сообщения и сделать другойPOST
в другойURL
на вашем удаленном сервере и передайте егоlongitude
иlatitude
. Для обработки сообщений я включаю несколько ссылок ниже.
и для получения координат без GPS, кажется, не слишком много решений, но есть некоторые. Вот пример:как получить значение долготы Latitute без использования GPS в Android?
подробнее об этом:
вот что я сделал.
Fetch и хранить местоположения с помощью Google Play services fused location provider, как описано здесьздесь
-
Я бы избегал настройки службы, вместо этого вы должны вызвать сигнал тревоги, который запрашивает последнее доступное местоположение. Это дополнительно экономит батарею, поскольку приложение не ищет местоположение 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); } }
поскольку вы не упомянули, что хотите обновления в режиме реального времени, я думаю, вы можете просто сбросить все данные в базу данных temp sqlite.
создать приемник для отслеживания изменений в сети и когда через WiFi просто отправить все данные на сервер. Вы можете быть немного умнее, делая это, отправляя только тогда, когда определенное количество записей накопилось или на периодическом интервал.
в качестве альтернативы сервер может отправить пинг в приложение через GCM mnotification, который также может вызвать отправку данных на ваш сервер.этой это удивительный учебник для описания отправки сообщений GCM в приложение.
Наконец, некоторые очень интересные стратегии местоположения упоминаются здесь. Вы можете пос, когда, чтобы вызвать ваше местоположение сохранить на основе активности пользователя или какой-либо другой контекст.
надеюсь, что это помогает.