如何定期向 Web 服务器发送位置数据(纬度、经度)
Posted
技术标签:
【中文标题】如何定期向 Web 服务器发送位置数据(纬度、经度)【英文标题】:how to send location data (latitude, longitude) periodically to web server 【发布时间】:2017-08-25 09:18:44 【问题描述】:我正在开发实时应用程序,因此我需要使用 REST API 将连续或一些周期性(以秒为单位)的位置数据作为纬度和经度发送到 Web 服务。那么我可以用什么来向服务器发送连续或周期性的数据呢?我需要使用后台服务还是其他什么?我不知道后台服务如何工作以及如何使用它?所以有人可以帮我吗?提前致谢。
protected void startLocationUpdates()
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, this);
protected void stopLocationUpdates()
LocationServices.FusedLocationApi.removeLocationUpdates(
mGoogleApiClient, this);
@Override
public void onConnectionFailed(ConnectionResult result)
Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = "
+ result.getErrorCode());
@Override
public void onConnected(Bundle arg0)
displayLocation();
if (mRequestingLocationUpdates)
startLocationUpdates();
@Override
public void onConnectionSuspended(int arg0)
mGoogleApiClient.connect();
@Override
public void onLocationChanged(Location location)
mLastLocation = location;
Toast.makeText(getApplicationContext(), "Location changed!",
Toast.LENGTH_SHORT).show();
displayLocation();
【问题讨论】:
我想你可以在手机和服务器之间使用套接字来进行实时更新。 你不需要什么特别的。您不需要在您的设备上运行的服务。只需将 lat,lon 发送到您的服务器。如果您的位置侦听器在 onLocationChanged 中有新的纬度,经度,则再次发送。等等。我不明白这个问题。 我想从后台连续发送位置到服务器 【参考方案1】:如果您想在应用程序关闭后连续向服务器发送数据,则需要为此创建一个服务。
这是我的服务方式。
public class FeatureService extends Service
@Nullable
@Override
public IBinder onBind(Intent intent)
return null;
@Override
public void onCreate()
// make your api call here and other implementations according to your requirement.
super.onCreate();
@Override
public void onDestroy()
// what you want when service is destroyed
在 Manifest 中声明您的服务
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name="Your Serive"
android:enabled="true">
</service>
</application>
最后在您的相关活动的 onCreate 中像这样调用您的服务。
Intent i= new Intent(this,FeatureService.class);
startService(i);
【讨论】:
你能给我例子或教程链接吗? 在这种情况下,如果我启动服务并从服务的 oncreate() 进行 api 调用,它是否会连续调用 api?还是只有一次? 它只会调用一次,但你可以使用 Handler 连续调用你的 api 你可以从这里得到 Handler 的例子***.com/a/40058010/6497550 我需要在服务的 onCreate() 中使用这个处理程序吗?并在处理程序内部进行 api 调用?对吗? 是的,如果出现任何错误,请在此处评论【参考方案2】:获取 lat 和 Long 值,然后调度一个周期性任务来运行发送值到服务器的方法
您可以使用 Job Scheduler (https://developer.android.com/reference/android/app/job/JobScheduler.html)
或
您可以使用 android-job/evernote 执行周期性任务 (https://github.com/evernote/android-job)
private void schedulePeriodicJob()
int jobId = new JobRequest.Builder(DemoSyncJob.TAG)
.setPeriodic(TimeUnit.MINUTES.toMillis(15), TimeUnit.MINUTES.toMillis(5))
.setPersisted(true)
.build()
.schedule();
【讨论】:
以上是关于如何定期向 Web 服务器发送位置数据(纬度、经度)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 FusedLocationProviderClient 获取准确的位置(纬度和经度)