Google提供了融合的位置提供程序API,以获取位置坐标。根据文档,API在内部轮询来自不同提供商(GPS,Wifi,蜂窝网络)的位置数据,并提供最佳位置。但是,在高精度模式下,我收集了以下信息。在此测试中,GPS始终处于打开状态。
Latitude: 12.8560136
Longitude: 80.1997696
User Activity: IN VEHICLE
Speed: 21.810165 mph
Altitude: -83.0
Accuracy: 12.0
Run Code Online (Sandbox Code Playgroud)
当我在地图上看到该点时,这些点不在路上。他们离路有点远。道路上还会绘制其他具有相同精度的点。当我完全缩放并看到时,其中一些点与行驶的道路略微偏离。
我想要准确的信息。它的点必须在道路上。
我已经使用了Fused Location API来获取位置信息。
mGoogleApiClient = new GoogleApiClient.Builder(mContext)
.addApi(LocationServices.API).addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).build();
Run Code Online (Sandbox Code Playgroud)
分享您的建议。如果我使用位置管理器,它将解决我的问题。而且我只需要消耗更少的电池。融合的API保证仅消耗更少的功率并提高效率。
此外,Fused Location API还有以下问题,
- 无法获得卫星计数。
- 始终返回FUSED提供程序。没有确切给出哪个提供者(GPS或网络)返回位置信息。
- 当两个提供者都不可用时,您永远不会收到通知。当没有提供程序可用时,它将不返回任何值。要检查提供商的可用性,我们需要分别向位置管理器注册。消耗更多的功率。
请帮我。提前致谢。
我正在为Android创建自定义Phonegap插件,该插件在应用程序处于前台和后台时都会监控位置.关于使用FusedLocationProviderAPI的 Google文档非常清楚.到目前为止我已经制定的过程如下
确保API可用
GoogleApiAvailability api = GoogleApiAvailability.getInstance();
int code = api.isGooglePlayServicesAvailable(ctxt);
return (code == ConnectionResult.SUCCESS);
Run Code Online (Sandbox Code Playgroud)使用指定的回调定义LocationListener,以处理方法重新生成的结果requestLocationUpdates.
事情变得有点不清楚
setInterval - 应用程序希望位置更新的时间间隔setFastestInterval - 消耗更新的时间间隔(如果可用).setSmallestDistance&setPriorty- 足够清楚setNumUpdates - 我的工作原理并不清楚.在线之间阅读我假设如果我使用setInterval(60000)并且setNumUpdates(1000)系统将在接下来的6000分钟内继续发回位置更新,或者直到应用程序后台/关闭或我/用户取消位置更新.但这就引出了一个问题 - 应用程序需要做些什么来成为一个好公民.我假设必须是这样的
PendingResult 返回的内容requestLocationUpdates.PendingResultt.cancel()在让应用程序进入后台之前调用如果有人可以评论这个工作流程的正确性,我会非常感激.
一个相关的问题-该文档的PendingResult状态
调用者或回调接收者有责任释放与返回结果相关的任何资源.
我不清楚他们在这里谈论的资源是什么.该LocationListener.onLocationChanged事件返回一个Location对象,我认为该对象在超出范围时将被垃圾收集.据推测,PendingResult返回的requestLocationUpdates应该被取消,然后当应用程序进入后台时设置为null.通过释放资源还有什么需要做的吗?
几个小时之后
我创建了两个版本的测试应用程序
setNumUpdates(10000).以App 1的形式弹出位置变化的祝酒词:位置是......setNumUpdates(1).以App 2`的形式弹出位置变化的祝酒词:位置是...... …我正在使用FusedLocationProvider API向PendingIntent注册一些Geofences,当我的应用程序启动时(应用程序被手动杀死以触发此行为)通过Geofence事件,我启动后台服务来做一些工作.
在这个服务中,我创建了一个单独的后台线程来执行一些长时间运行的任务,我获得了一个唤醒锁,以便我确信我的任务已经完成.服务保持运行更长的时间(30 - 50分钟),即使它不应该.根据我对Android O最近的变化的理解,它不应该是白名单并且保持自己运行更长的时间.
PendingIntents唤醒应用程序是否需要行为或某种错误,然后将其视为白名单,即使这些意图不是通知(即用户可以看到的任何内容).
android android-pendingintent fusedlocationproviderapi android-8.0-oreo
随着FusedLocationProviderApi被弃用,我使用的是有一个很难FusedLocationProviderClient的按钮点击后能得到用户的位置只有一次。
android location fusedlocationproviderapi android-fusedlocation
我想使用FusedLocationProviderApi来获取最后的已知位置.我就像Google教程所说的那样,但似乎GoogleApiClient没有连接,至少它不会触发onConnected和onConnectionFailed方法.我希望你能提前帮助我.
import com.example.stoos.data.DataModelOrt;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter;
import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener;
import com.google.android.gms.maps.GoogleMap.OnMapLoadedCallback;
import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
.
.
.
public class OrtHinzufugen extends Activity implements
ConnectionCallbacks, OnConnectionFailedListener{
.
.
.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ort_auswahlen);
getActionBar().setDisplayHomeAsUpEnabled(true);
buildGoogleApiClient();
.
.
.
}
protected synchronized void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API) …Run Code Online (Sandbox Code Playgroud) 我有一个LocationReceiver曾经从一个FusedLocationProviderApi.KEY_LOCATION_CHANGED提取Location一个Intent.但是现在KEY_LOCATION_CHANGED被弃用了我应该把它更改为什么?
当前代码:
@Override
public void onReceive(Context context, Intent intent) {
final Location location = (Location) intent.getExtras().get(FusedLocationProviderApi.KEY_LOCATION_CHANGED);
if (location != null) {
float accuracy = location.getAccuracy();
Log.d(LocationReceiver.class.getSimpleName(), "*** Accuracy is: " + accuracy + " ***");
} else {
Log.d(LocationReceiver.class.getSimpleName(), "*** location object is null ***");
}
}
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中的一个片段中,我需要位置更新,以确定用户何时接近一个简短的位置列表,以便用户可以获得相关信息.当我在onConnected()回调中使用创建位置更新请求时
LocationServices.FusedLocationApi.requestLocationUpdates(client, LocationRequest.create(), this);
Run Code Online (Sandbox Code Playgroud)
我还使用了删除onPause()方法中的更新
LocationServices.FusedLocationApi.removeLocationUpdates(client, this);
Run Code Online (Sandbox Code Playgroud)
然而,即使我调用该方法来删除位置更新,我也会从泄漏金丝雀那里得到警告,每当我离开该片段时,我的片段就会被泄露(所有片段导航都是使用replace()事务完成的).我在我的片段中启动位置请求时做错了什么,或者我没有在onPause()中正确清理请求,对此的任何帮助将不胜感激.
这是我的片段类的简化模型中的代码
public class BlankFragment extends Fragment implements GoogleApiClient.ConnectionCallbacks
, GoogleApiClient.OnConnectionFailedListener, LocationListener {
private GoogleApiClient client;
private TextView textView;
public BlankFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_blank, container, false);
textView = (TextView) root.findViewById(R.id.location);
client = new GoogleApiClient.Builder(getContext())
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
return root;
}
@Override
public void onConnected(@Nullable Bundle bundle) {
startLocationUpdates();
}
private void startLocationUpdates() {
if …Run Code Online (Sandbox Code Playgroud) android android-fragments google-play-services fusedlocationproviderapi leakcanary
我有一个项目,在其中我已经成功实现了位置跟踪功能,并且运行良好。我每 30 秒使用融合位置提供程序跟踪用户当前位置。(跟踪在 MainActivity 启动时开始)。
现在我计划使用新引入的 Android 架构组件来更新该项目。但我不知道如何使用视图模型实现位置跟踪。在MainActivity 或 Application类中,哪里是开始位置跟踪的正确位置?我应该使用ViewModel 还是 AndroidViewModel?如何实现这一目标。
android fusedlocationproviderapi android-livedata android-viewmodel android-architecture-components
因此,我正在开发一个天气预报应用程序,其中我使用 fusedLocationProviderClient.lastLocation 访问设备位置,并且我们大多数人都知道位置提供程序返回一个任务,因此我使用协程 Deferred ,以便每当任务完成时它都会给出我的设备位置请查看代码以便更好地理解
private fun getLastDeviceLocation(): Deferred<Location?> {
return if (hasLocationPermission())
fusedLocationProviderClient.lastLocation.asDeferred()
else
throw LocationPermissionNotGrantedException()
}
Run Code Online (Sandbox Code Playgroud)
但现在我希望我的位置是一个实时位置,因此我必须使用协程流,这样每当我的位置发生变化时,我就能够自动获取新位置的天气,但因为我是 kotlin 协程的新手,所以我我不知道如何实现这一点以及我如何能够使用延迟流,
任何人都可以帮助我,或者如果这不可行,请建议我做一些其他工作来实现我的目标 提前致谢
android fusedlocationproviderapi kotlin-coroutines kotlinx.coroutines.flow
我有错误在声明时无法解析符号'FusedLocationProviderClient'
private FusedLocationProviderClient mFusedLocationClient;
Run Code Online (Sandbox Code Playgroud)
这里要求同样无法解析符号:FusedLocationProviderClient.Google Play服务版使用了11.0.1.但在使用最新的播放服务时仍然出现错误.