gpt4 book ai didi

android - 如何从我的应用程序的所有用户获取GPS坐标?

转载 作者:行者123 更新时间:2023-11-29 14:18:30 26 4
gpt4 key购买 nike

说明/场景:

我正在开发一个应用程序,该应用程序需要实时获取(例如3sec的更新)我的应用程序的所有用户的位置,并且这些用户知道,他们也将在地图上看到另一个用户的位置,例如:



该位置必须是实时的,因为所有用户都可以访问地图,因此他们需要确切地知道该应用程序的用户在哪里才能找到自己。

题:

我需要做些什么才能使我的应用程序实时获取所有用户在gps坐标中的位置(以备以后在地图上使用)?

Obs:

我并不是要一个完整的应用程序,我只是想知道如何获取每个用户的坐标,如果一个答案包含如何在地图上放置坐标,那将非常有用!并会得到赏金

最佳答案

您希望用户以固定的时间间隔检索其坐标,因此(至少)需要:


好的中央服务器(或多台服务器)。考虑到每3秒发送一个职位并拥有(例如)100个用户将导致大量的信息请求,因此它也将需要一个良好的基础架构。
一些将信息广播给您的客户的技术。获得信息后,您将希望在用户中传播信息,以使他们知道附近有谁。
用来存储从用户那里获得的信息的某些技术:最符合技术的是:数据库。


因此,请逐步:

得到什么样的坐标?

有两种类型的位置坐标:


GPS定位器
网络位置提供者


在获取坐标信息方面,网络位置通常比GPS更快。此外,在某些情况下,例如室内位置,GPS可能非常慢,更糟糕的是,它将使电池耗电更快。但是,网络位置提供程序取决于蜂窝塔,实际上,它是返回的值(而不是您的实际当前位置),因此GPS位置要准确得多。我建议使用后者。

如何获得坐标?

这个主题在SO上已经解决了很多次,只需进行搜索即可获得很多信息。关于每X次发送用户的位置,可以使用LocationManager完成。因此,您将定义如下内容:

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, REFRESH_TIME, MIN_DISTANCE, locationListener);


这将要求用户当前位置,并刷新每个 REFRESH_TIME(这是一个自定义常量,您可以将其设置为所需的任何值,但是您必须根据远程服务器的技术能力对其进行调整),并使用 (位置相同,这里是一个常数)作为位置更新之间的最小距离(以米为单位),并且应将结果提供给将处理结果的 MIN_DISTANCE。该侦听器应如下所示:

private final LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(final Location location) {
...
}
};


因此,每次用户位置根据上面定义的2个参数更改时,都会调用此 Listener方法。

不要忘记将此行添加到您的 onLocationChanged()文件中:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />


好的,我在这个方法中放什么呢?

在此您可以向远程服务器发起请求,以告知您当前的职位。最简单的方法是部署一个Web服务器,该服务器将具有您喜欢的语言( AndroidManifestPHP ...)的Web服务,并将相应地处理请求。通知最简单的方法是对Web服务执行简单的 Python请求,因此其中的代码如下所示:

final HttpClient httpclient = new DefaultHttpClient();
final HttpPost httppost = new HttpPost("http://www.yourremoteserver.com/mywebservice.php");

try {
final List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("Latitude", String.valueOf(location.getLatitude()));
nameValuePairs.add(new BasicNameValuePair("Longitude", String.valueOf(location.getLongitude()));

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
}
catch (final ClientProtocolException e) { e.printStackTrace(); }
catch (final IOException e) { e.printStackTrace(); }


就是这样,现在您的远程服务器将接收您的数据。但是还有其他遗漏的东西:如何识别每个用户?根据您的实现,您可能希望发送用户的IP地址,或者更有可能是用户名。因此,在后一种情况下,您需要添加另一个 HTTP POST,如下所示:

nameValuePairs.add(new BasicNameValuePair("username", methodThatReturnsUsersName());


如果要使用IP地址,则无需发送它,最好依靠服务器可能收到的信息(否则可能会被篡改)。

如何在服务器端处理所有这些信息?

我假设您使用 BasicNameValuePair(因为这是我所熟知的语言),但是您可以按照自己的意愿进行操作,唯一的条件是它必须是某种HTTP友好的语言。您将通过以下方式获取发送的变量:

<?php
$latitude = $_POST['Latitude'];
$longitude = $_POST['Longitude'];
$username = $_POST['username'];
?>


并且,例如,将其存储在具有3个字段的表中:

mysqli_query("INSERT INTO current_locations(longitude, latitude, username) VALUES($latitude, $longitude, '$username')", $my_link);


如果要包括用户的IP地址,可以通过以下方式获取:

$ip = $_SERVER['REMOTE_ADDR'];


就这样。您正在接收用户的信息并将其存储在数据库中。

太好了,现在我该如何在用户中传播所有这些信息?

您需要某种机制来模拟 PHP协议来发送所有这些信息。这种情况看起来非常适合使用 multicast。我已经写了 an answer a time ago来描述如何实现它,因此在这里不再赘述。总结:您将知道谁注册了您的 Google Cloud Messaging项目,现在可以向他们发送所需的信息。需要考虑的几点:


用户在没有同情心的情况下从他们的位置发送数据将对您造成轰炸。一段时间后,如果您有足够的用户,则可以每分钟存储数千个位置。以某种方式,您必须传播该信息并删除无用的信息。
在这种方法中,似乎最好的管理所有数量数据的方法是使用同步方法,该方法将处理数据库中的所有当前信息。如果服务器是linux / unix环境,则可能要使用 Google Cloud Messaging。在MS下,编程任务就足够了。
就是说,您需要触发一个脚本,该脚本将提取所有数据并再次以您喜欢的语言对其进行相应处理,然后将其放入该 cron /编程任务中,以便每隔一定时间触发一次。


提示1:您可能希望您的应用在全球范围内使用。因此,如果您在阿根廷,为什么要将您的位置发送给中国的用户?为此,您可以在该脚本中实现某种距离算法,该算法针对每个位置,将基于距离阈值计算最近的用户,并将该用户的信息仅发送给他们。 Haversine formula是最著名的之一,但是有很多。只需找到您认为合适的方法并实施即可。这将大大减少无用的发送信息,但是,这将花费更多的时间进行计算,因此远程服务器的规格同样很重要。打个比方,您不会像集线器那样,而是像交换机一样。

提示2:我已经提到了存储的信息量。每次运行此脚本时,都应提取当时的全部数据,确定将每个位置发送给谁,然后再将其从数据库中删除。一旦发送,该信息将被淘汰,那么为什么要继续存储它并使您的数据库庞大而低效?

如何显示接收到的坐标?

Google有 cron的API,建议您使用。与标记有关的信息是 here。如果您阅读了我上面提到的有关 Google MapsGoogle Cloud Messaging的引用链接,则会看到有一个 GCM documentation处理发送到特定客户端的消息。因此,在这里,类似于上面有关发送位置的代码,现在您正在接收位置。因此,您需要实现以下内容:

public class GCMprocess extends IntentService {
public GCMprocess() { super("GCMIntentService"); }

@Override
protected void onHandleIntent(final Intent intent) {
final GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);

final String messageType = gcm.getMessageType(intent);
final Bundle extras = intent.getExtras();

if ((!extras.isEmpty()) && (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType))) {
// This method will be fired for each location of each user sent by your cron'ed script
String longitude = extras.getString("longitude");
String latitude = extras.getString("latitude");
String username = extras.getString("username");

// And this places the content in your google map:
private GoogleMap mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
mMap.addMarker(new MarkerOptions().position(new LatLng(Double.parseDouble(longitude), Double.parseDouble(latitude))).title("User " + username));
}

GCMBroadcastReceiver.completeWakefulIntent(intent);
}
}

关于android - 如何从我的应用程序的所有用户获取GPS坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23112784/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com