我正在使用FusedLocationProviderClient进行位置请求.我保留了一个计时器30秒,以检查在该时间范围内是否收到位置.代码如下:
public void requestLocationUpdates() {
initializeLocationRequest();
mFusedLocationProviderClient.requestLocationUpdates(mLocationRequest, mLocationCallback, null);
startTimer();
}
private void initializeLocationRequest() {
mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(mContext);
mLocationRequest = new LocationRequest();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(5000);
mLocationRequest.setFastestInterval(5000);
mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
synchronized (SilentCurrentLocationProvider.this) {
super.onLocationResult(locationResult);
Location location = locationResult.getLastLocation();
}
};
}
private void startTimer() {
if (mTimeout < 1) {
mTimeout = mDefaultTimeout;
}
mTimer = new Timer();
mTimer.schedule(new LocationTimer(), mTimeout * 1000);
}
Run Code Online (Sandbox Code Playgroud)
在少数设备上,位置不会到来.在进一步调试时,我发现正在创建LocationRequest和LocationCallback,但它没有进入onLocationResult()方法.
由于这是实时产品的一部分,因此很难在每台设备上进行调试.即使我尝试重新启动手机,但它无法正常工作.用户尝试了其他应用程序,如Ola和位置即将到来. …
android google-location-services fusedlocationproviderclient
我一直在使用GoogleApiClientInterval和Displacement 更新来处理和测试背景位置更新.在测试和分析几天后,我发现输出中的一些变化,我没想到.
在使用setInterval和setFastestInterval基于Interval的更新时,比如说我将Interval设置为15分钟,将Fastest Interval设置为10分钟,90%的时间我在预期的间隔(10到15分钟)内获得更新.但有时我注意到更新所需的时间比指定的Interval长得多,例如,差异大约是30分钟和60分钟.关于为什么差异的任何想法?
在使用setMinimumDisplacement基于距离的更新时,比如说我已将Displacement设置为200米,我只能在200米及以上的静止点上进行更新(当旅行时,即使超过200米也没有更新).这是正常的吗?
我正在使用PendingIntent位置请求类型,以便BroadcastReceiver在后台接收位置更新的位置更新.
fusedLocationProviderClient.requestLocationUpdates(locationRequest, pendingIntent);
Run Code Online (Sandbox Code Playgroud)
测试时,位置服务已开启,位置模式为HIGH_ACCURACY.
我在 Google I/O '18 上与一位 Google 工程师进行了交谈。他告诉我,我可以信任 fusedLocationProvider。如果他用新的时间戳标记最后一个已知位置,则用户可能仍在同一位置。
我想在未来用一个“移动”的设备做一些测试来证明这个说法。
我正在从FusedLocationProviderClientwith请求最后一个已知位置,getLastLocation()并想检查最后一个已知位置是否早于 5 分钟以开始新的位置请求。
在我的测试过程中,我发现了一个奇怪的行为与elapsedRealtimeNanos应该用来比较的位置。
出于测试目的,我在一个简单的 Java 线程中每秒请求最后一个已知位置。收到位置后,我检查 elapsedRealtimeNanos 并将它们与SystemClock.elapsedRealtimeNanos(). 在大多数情况下,最后一个已知位置的年龄也设置SystemClock.elapsedRealtimeNanos()为,因此差异接近 0。这意味着 FusedLocationProvider 告诉我最后一个已知位置的修复是现在,这使得年龄检查不可靠。
这种行为很奇怪,但它变得更糟。
当我在测试会话期间启动并行位置请求或启动 Google 地图时,elapsedRealtimeNanos最后一个已知位置的位置停止增长,只有在找到“真实”新位置时才会更新到更新的时间。这应该是我期望的默认行为。
我在 HIGH_ACCURACY 和 SENSORS_ONLY 等不同的位置设置中观察到了这种行为。
这是否意味着检查最后一个已知位置的年龄是不可能的?任何人都可以解释这种行为吗?
相同的行为 location.getTime()
代码片段:
@Override void getLastKnownLocation() {
try {
mLocationClient.getLastLocation().addOnCompleteListener(new OnCompleteListener<Location>() {
@Override
public void onComplete(@NonNull Task<Location> task) {
try {
Location location = task.getResult();
if (location != null) …Run Code Online (Sandbox Code Playgroud) android location google-play-services android-fusedlocation fusedlocationproviderclient
在搭载 Android 12 (SPB5.210812.002) 的 Pixel 4a 上,当用户授予近似位置权限时,不会从FusedLocationProviderClient. 当我将权限更改为精确位置权限时,我就可以获取位置。
我在清单中拥有粗略和精细的位置权限,并在运行时请求这两种权限。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)
一旦获得任一许可,我就会请求lastKnownLocation以及位置更新。有了精确的位置许可,我很快就能获得位置,但当用户提供大致位置许可时就无法获得位置。
对于位置请求优先级,我已经尝试过LocationRequest.PRIORITY_HIGH_ACCURACY和LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY。
在 Android 9 上,一切都按预期工作,所以我猜这与Android 12 中引入的精确/近似位置权限有关。
这是我的代码的一部分:
private val fusedLocationClient by lazy {
LocationServices.getFusedLocationProviderClient(requireContext())
}
private val cts: CancellationTokenSource = CancellationTokenSource()
private val locationRequest = LocationRequest()
.setPriority(LOCATION_REQUEST_PRIORITY)
.setFastestInterval(MIN_TIME_BETWEEN_STAMPS_IN_MILLIS) // 1000
.setInterval(TIME_BETWEEN_STAMPS_IN_MILLIS) // 10000
private val locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
locationResult?.locations?.firstOrNull()?.let {
userLocation = it
onUserLocationUpdated() …Run Code Online (Sandbox Code Playgroud) location fusedlocationproviderclient android-12 android-api-31
我无法理解为什么这个非常简单的活动会产生内存泄漏.
它遵循此处给出的指导原则:https://developer.android.com/training/location/receive-location-updates.html以及此处给出的示例代码:https://github.com/googlesamples/android-play-location /树/主/ LocationUpdates
我还注意到,如果我不重写LocationCallback类的onLocationResult方法,则会解决内存泄漏问题.但就这种方式而言,LocationCallback完全没用.
谢谢您的帮助!
public class TestLeaks extends Activity {
private FusedLocationProviderClient mFusedLocationClient; // Access to Fused Loc. Provider API
private LocationRequest mLocationRequest; // Stores parameters for requests to F.L.P.Api
private LocationCallback mLocationCallback; // Callback for Location events
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_leaks);
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
Location loc = locationResult.getLastLocation();
((TextView) findViewById(R.id.latitude)).setText(String.format(Locale.US, "%.6f", loc.getLatitude()));
((TextView) findViewById(R.id.longitude)).setText(String.format(Locale.US, …Run Code Online (Sandbox Code Playgroud) android memory-leaks google-api-client location-updates fusedlocationproviderclient
我目前正在创建一个位置客户端,目前我有
public void startUpdatingLocationProcess(Context context) {
parentContext = context;
if (mFusedLocationClient == null){
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(parentContext);
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(5000);
mLocationRequest.setFastestInterval(5000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
if (ContextCompat.checkSelfPermission(parentContext, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
{
mFusedLocationClient.requestLocationUpdates(mLocationRequest, new LocationCallback(){
@Override
public void onLocationResult(LocationResult locationResult) {
onLocationChanged(locationResult.getLastLocation());
}
} , Looper.myLooper());
}
}
Run Code Online (Sandbox Code Playgroud)
这是在我想在整个应用程序生命周期中运行的 LocationApi 类中,这个特定的应用程序运行许多活动,所以我不想在每次销毁和创建新活动时“重新创建”请求。
允许并检查 FINE_LOCATION 的权限,logcat 中没有错误,代码在创建 mFusedLocationClient 对象时运行 requestLocationUpdates 方法,但它从不调用“onLocationResult”方法。
使用这个 api 有什么我遗漏的吗?
经过大量阅读并与自己进行斗争之后,我必须询问我更好的同行。
我有一种无法解释的行为FusedLocationClient。
我想获取向用户显示一些信息的位置(仅一个实例)。为此我称之为:
mFusedLocationClient.getLastLocation().addOnSuccessListener(...)
如果 的位置getLastLocation()为空。我想“快速启动”客户端来为我获取一个位置。
LocationRequest locationRequest = new LocationRequest();
locationRequest.setFastestInterval(5000);
locationRequest.setInterval(10000);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
Timber.d("OnLocationResult entered");
if (locationResult != null && !locationResult.getLocations().isEmpty())
findCurrentArea();
}
@Override
public void onLocationAvailability(LocationAvailability locationAvailability) {
Timber.d("OnLocationAvailability entered");
super.onLocationAvailability(locationAvailability);
}
};
mFusedLocationClient.requestLocationUpdates(locationRequest, mLocationCallback, null);
Run Code Online (Sandbox Code Playgroud)
首先我要说的是,我也使用过来LocationSettingsRequest检查设置,并且总是成功。
奇怪的部分:
onLocationAvailability()被调用两次。第一次响应是 true 但onLocationResult()没有被调用,然后我得到了 false 的可用性!有几次我不止一次地接到这个电话。
在使用 Android 6-8 的多个设备中观察到上述行为。搭载 Android 9 的 Pixel 3 可以按预期提供位置。
如果我在有问题的设备上启动 Google 地图并打开位置,在这种情况下地图也无法显示位置。如果我关闭该位置,我会看到带有“?”的地图位置按钮。在里面。按下地图中的按钮,我会弹出一个窗口,提示我应该打开位置。好的,我的应用程序中的位置服务也恢复了!!!
如果我使用失败案例LocationSettingsRequest …
每次用户打开我的应用程序时,我都试图获取用户的位置,这是我的代码。我注意到该onLocationResult方法从未被调用,而且我无法获得位置更新。谁能帮我解决这个问题?
final LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10000);
mLocationRequest.setFastestInterval(5000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_LOW_POWER);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(mLocationRequest);
SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
// All location settings are satisfied. The client can initialize
// location requests here.
// ...
LocationCallback mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
if (locationResult == null) {
return;
}
for (Location location : locationResult.getLocations()) {
Log.d("asdffff",""+ location.getLatitude());
Log.d("asdffff",""+ …Run Code Online (Sandbox Code Playgroud) I am getting coordinates with FusedLocationProviderClient in my application on a button click to store into a database. The issue is that when I reboot the phone or the emulator the .getLastLocation() is null and I have to click another time the button i order for this to work. Is there a way to force to get a current position if the value of location from .lastKnownPosition() is null?
// Google fused location client for GPS position
private FusedLocationProviderClient flpc; …Run Code Online (Sandbox Code Playgroud) Android Fusedlocationproviderclient 无法与 APN Sim 一起使用(这意味着私有互联网,并非所有人都可以访问),它可以与 Wifi 或普通互联网(这意味着全球移动互联网)一起使用,我还尝试了位置管理器(Play 服务无法启用这些设备)。
活动课
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
//import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.PowerManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationAvailability;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.tasks.OnCanceledListener;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener; …Run Code Online (Sandbox Code Playgroud) android location locationmanager fusedlocationproviderclient