如何获取位置或仅获取ID以提供基于位置的内容?

时间:2019-02-28 08:49:06

标签: android api google-maps geolocation beacon

我正在构建一个android应用,我希望我的应用提供基于位置的内容。例如,如果我在博物馆附近或其中一个,请向我显示有关该博物馆的详细信息。问题是如何识别该位置。最佳方法是什么?

好的信标可以完美地完成工作,它们发出一个带有id的信号,我的应用读取该id并提供相关信息。但是我要花一些时间才能获得一些信标,因此,如果有任何类似的技术,请在这里列出。

GPS技术或API只要简单而又不会过于复杂就可以了,因为我只想让我的应用程序验证它是否已到达某个位置,然后在此基础上显示内容。

我有什么选择?

1 个答案:

答案 0 :(得分:0)

最简单的选择可能是使用手机gps位置,而不使用信标。

为此,您需要找到一个博物馆API来显示有关最近博物馆的信息。

然后,您可以在Android中使用Dockerfile首先检查是否授予了位置权限:

docker-compose.yml

然后,我们需要执行以下操作:

LocationManager

另一种获取位置的优雅方法是实施private Location getLastKnownLocation() { Location n = null; LocationManager mLocationManager = (LocationManager)getApplicationContext().getSystemService(LOCATION_SERVICE); List<String> locationProviders = mLocationManager.getProviders(true); for (String provider : locationProviders) { if(ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)==PackageManager.PERMISSION_GRANTED) { n = mLocationManager.getLastKnownLocation(provider); } } return n; } 反应式方法。

这种方法允许使用lambda,链接可观察对象和使用延迟计算来保持代码简洁。这样做的方法是将RxPermissions库和RxLocation库结合起来以提高灵活性。

此帖子的以下代码摘自两个图书馆提供的官方文档,并进行了一些修改以适合此讨论:

Location gps = getLastKnownLocation();

String latitude = Double.toString(gps.getLatitude());
Log.e(“User Location Latitude”, “” + gps.getLatitude());

String longitude = Double.toString(gps.getLongitude());
Log.e(“User Location Longitude”, “” + gps.getLongitude());

Uri baseUri = Uri.parse(“YOUR_API_URL” + latitude + “YOUR_API_URL” + longitude + “YOUR_API_URL”);
Log.e(“Api Query”, “” + baseUri);

Uri.Builder uriBuilder = baseUri.buildUpon();

与之前的常规非反应性方法类似,我们创建getLastKnownLocation

final RxPermissions rxPermissions = new RxPermissions(this);

rxLocation = new RxLocation(this); 

下面的getLastKnownLocation属于private void getLastKnownLocation(final String apiSearch) { compositeDisposable.add(rxPermissions .request(Manifest.permission.ACCESS_FINE_LOCATION) .subscribe(granted -> { if (granted) { ,这是一个懒惰的实现,表示延迟的Rx计算。

与Observable不同,它允许lastLocation()Maybe<T>onSuccess作为互斥事件进行操作,因此,如果位置不可用,则不会向订户返回任何值。

使用该库会将LocationServices.FusedLocationApi包装在onComplete中:

onError

根据文档,我们发送用户位置请求:

rxLocation.location()

我们订阅位置更新,以防止位置返回空值,这在传统的非反应性方法中是可能的。使用该库会将LocationServices.FusedLocationApi包装在 rxLocation.location().lastLocation() .doOnSuccess(location -> { // Your code implementation for Received Last Known Location: If last known location is already known & exists, to pass the existing last known location into your museum api, to fetch results to your adapter }) .doOnComplete(() -> { // Your code implementation for handling the Location Request, then doing a Completing action: This sends a new request to request the latest user location, before subscribing to your museum api, to fetch results to your adapter }) .doOnError(throwable -> // Your code implementation to handle any errors thrown: Pops a toast message to prompt user to enable GPS location on phone }) 中:

private void latestLocation(final String apiSearch) {
  LocationRequest locationRequest = LocationRequest.create()
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .setInterval(6000); // 6s

由于下面的rxLocation.location()调用属于rxLocationSubscriber = rxLocation.location().updates(locationRequest) ,因此返回Maybe。我们通过fromLocation()将其转换为Observable,以便与支持线程并发的Maybe<T>一起使用。该库将Geocoder API包装在toObservable中:

flatMap

我认为最直接的方法是概述的第一种方法。

希望这会有所帮助。