gpt4 book ai didi

android - 如何获取位置或只是一个 id 以提供基于位置的内容?

转载 作者:行者123 更新时间:2023-11-30 05:03:54 31 4
gpt4 key购买 nike

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

信标完美地完成了这项工作,它们发出带有 ID 的信号,我的应用程序读取 ID 并提供相关信息。但是我需要一些时间才能获得一些信标,所以如果有任何类似的技术,请在此处列出它们。

GPS 技术或 API 都可以,只要它简单又不过分复杂即可,因为我只想让我的应用验证它已到达某个位置,并在此基础上显示内容。

我有哪些选择?

最佳答案

最简单的选择可能是使用您的手机 GPS 位置,无需信标。

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

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

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;
}

然后我们需要做以下事情:

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 react 方式。

这种方法允许使用 lambda、链接可观察对象和使用延迟计算来保持代码简洁。这样做的一种方法是结合 RxPermissions图书馆 & RxLocation图书馆的灵 active 。

本文的以下代码取自两个库提供的官方文档,并进行了一些修改以适合本次讨论:

final RxPermissions rxPermissions = new RxPermissions(this);

rxLocation = new RxLocation(this);

与之前的传统非 react 性方法一样,我们创建 getLastKnownLocation :

private void getLastKnownLocation(final String apiSearch) {
compositeDisposable.add(rxPermissions
.request(Manifest.permission.ACCESS_FINE_LOCATION)
.subscribe(granted -> {
if (granted) {

lastLocation()下面属于一个Maybe<T> ,这是一个惰性实现,表示延迟的 Rx 计算。

它允许onSuccess , onComplete & onError作为互斥事件运行,与 Observable 不同,如果位置不可用,则不会向订阅者返回任何值。

使用此库将 LocationServices.FusedLocationApi 包装在 rxLocation.location() 中:

      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

我们订阅位置更新,以防止位置返回 null,这在传统的非响应式(Reactive)方法中是可能的。使用此库将 LocationServices.FusedLocationApi 包装在 rxLocation.location() 中:

rxLocationSubscriber = rxLocation.location().updates(locationRequest)

因为 fromLocation()下面的电话属于Maybe<T> ,它返回一个可能。我们通过 toObservable 将其转化为 Observable , 与 flatMap 一起使用,支持线程并发。这个库在 rxLocation.geocoding() 中包装了 Geocoder API :

.flatMap(location ->

rxLocation.geocoding().fromLocation(location).toObservable())

.subscribe(location -> {

// your code implementation for museum api

rxLocationSubscriber.dispose();
});
}

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

希望对您有所帮助。

关于android - 如何获取位置或只是一个 id 以提供基于位置的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54921618/

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