如何定期向 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 服务器发送位置数据(纬度、经度)的主要内容,如果未能解决你的问题,请参考以下文章

即使应用程序关闭,也每 5 分钟向服务器发送纬度和经度

如何使用 FusedLocationProviderClient 获取准确的位置(纬度和经度)

定期发送 Azure 推送通知

当应用程序在后台时向服务器发送纬度和经度

如何将谷歌地图标记的纬度和经度发送到 Firebase - android? [关闭]

如何将极地系统转换为纬度和经度