Android在按下按钮时获得高分辨率的位置信息



我已经阅读了Android文档,FusedLocationProviderLocationManager;在stackoverflow仔细阅读了围绕这个话题的一系列令人眼花缭乱的问题和答案;并开发了许多迄今为止效果不佳的测试。为什么这是如此令人困惑和难以理解?

我有一个应用程序,当用户在该应用程序中执行操作时,它需要获得一个高分辨率的Location对象(lat/long/alt/accuration/etc);比方说他们按下了一个按钮。最好的方法是什么?

我使用了fusedLocationProviderClient.getLastLocation().addOnSuccessListener(),得到了非常混杂的结果。

我用过locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)。如果我在Galaxy S9上启动GPS状态应用程序,那么这会产生非常好的结果。但如果这种情况没有发生,那么结果就毫无价值。

我在这里错过了什么?每个人都喜欢指向这个Doc网站或那个Example网站,这些网站大多毫无价值,并没有真正回答这个特定的问题。我浪费了几个小时浏览那些根本无法回答这个问题的网站。请总结一下这里应该使用的通用算法和要进行的调用。这就是我所需要的。

我希望能够在我的院子里四处走动(这里和那里10米),按下按钮,让应用程序显示距离最后一个位置的纬度/经度/精度/海拔高度/距离,并在一定的精度范围内每次都是正确的。我该怎么办?我需要高精度,但能够通知用户精度低于100英尺,即使误差为400英尺,也能获得最佳精度。

您错过了GPS接收器的工作原理。

当没有使用精确定位的应用程序时,所有智能手机都会关闭GPS接收器以节省电池电量。

即使您选择了要打开的定位服务(在设置中),您也会在通知栏中注意到,只有当应用程序(如谷歌地图或GPS测试应用程序)处于活动状态时,才会出现GPS使用图标。

一旦接收器打开(因为一些应用程序需要它),就需要一段时间才能获得"修复"——准确的位置测量。

修复需要多长时间取决于几件事,包括环境条件、您的手机类型、自上次准确修复以来的时间和距离等。

这可能需要几秒钟到几分钟的时间。

所以,你应该做的是,在你的应用程序打开后立即订阅位置,并要求尽可能频繁地接收它。

然后,只有当您具有良好的准确性时才启用该按钮,并且当按下该按钮时,显示最新结果。

在等待准确的修复时,您可能还应该向用户显示一些微调器或消息,以便用户知道您的应用程序没有被卡住。

编辑:我所说的"订阅"是指注册必要的回调,以便您的应用程序在准备就绪时从系统接收位置。

如何做到这一点,取决于您选择哪种API。

谷歌文档中没有错误。如果您选择使用融合定位,则需要执行以下操作:

  • 创建一个位置请求对象,并将优先级设置为PRIORITY_HIGH_ACCURACY,也将setIntervalsetFastestInterval设置为1000(1秒),以获得最佳精度。

  • LocationServices获取FusedLocationProviderClient对象

  • 使用客户端注册回调到您的应用

这里有一些代码示例:https://developer.android.com/training/location/request-updates

在应用程序的回调功能中,您可以检查准确性,如果它足够好,您可以启用按钮并保存位置,以便在用户单击按钮时将其显示给用户。

好的-这似乎有效。这个总体流程似乎就是答案。

假设:您正在请求清单中的android.permission.ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION

仅对MainActivityonCreate()函数中的代码进行采样以进行测试。

  • 检查我们是否有ACCESS_FINE_LOCATION权限;如果没有,请求
  • 获取FusedLocationProviderClient
  • 从CCD_ 16中获取起始位置;用于比较和轨道起点
  • 定义CCD_ 17由CCD_;我们感兴趣的只是获取堆栈中的最后一个并保存到类Field中
  • 定义间隔5秒的LocationRequestPRIORITY_HIGH_ACCURACY
  • 检查用户设备是否允许这样做;如果不允许,除了通知用户之外,不知道该怎么办
  • 现在CCD_ 21使用上面定义的CCD_
  • 当用户执行需要当前纬度/经度的操作(例如按下按钮)时,检索上一个LocationCallback()上用Location对象填充的类字段

我对这种模式的反馈持开放态度。希望它能帮助其他人(因为这方面有很多问题)。我很想听听这个设计的任何问题或我可能遇到的问题。

if (Build.VERSION.SDK_INT >= 23) {
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_ASK_PERMISSIONS);
} else {
// getFusedLocationProviderClient
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
// getStartLocation
fusedLocationProviderClient.getLastLocation().addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
if (location != null) {
StartLocation.set(location);
}
}
}).addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
});
// Define LocationCallback
locationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
if (locationResult != null) {
LastLocation = locationResult.getLastLocation();
}
}
};
// Now lets request location updates - that is how this must happen
// https://developer.android.com/training/location/change-location-settings
LocationRequest locationRequest = LocationRequest.create();
locationRequest.setInterval(5000);
locationRequest.setFastestInterval(1000);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
// Attempt to see if requested settings are compatible with user device.
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(locationRequest);
// Check to see if location settings are satisfied by user's device settings?
SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> locationTask = client.checkLocationSettings(builder.build())
.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
}
}).addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
if (e instanceof ResolvableApiException) {
// Location settings are not satisfied, but this can be fixed
// by showing the user a dialog.
}
Toast.makeText(MainActivity.this, "Location Settings Are Not " +
"Correct On This Device", Toast.LENGTH_LONG).show();
}
});
// Request location updates
fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper());
}
}

相关内容

  • 没有找到相关文章

最新更新