我无法弄清楚为什么LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest, this);"FusedLocationApi"被淘汰并指出它已被弃用.
点击此处查看图片
import android.location.Location;
import android.location.LocationListener;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationRequest;
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.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
public class MaintainerMapActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener{
private GoogleMap mMap;
GoogleApiClient mGoogleApiClient;
Location mLastLocaton;
LocationRequest mLocationRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maintainer_map2);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment …Run Code Online (Sandbox Code Playgroud) 我试图通过使用获取位置FusedLocationApi.getLastLocation,我在清单文件中获得了位置权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)
但是,null当我从系统请求位置时,我得到了.我只是测试关闭和位置服务,所以它可能与此有关(当然,当我尝试这个时它是开启的).但即使在返回null之后,我也在等待onLocationChanged被调用,而且它从未被调用过.我在这里也看到了类似的问题:FusedLocationApi.getLastLocation总是为null
这是我的代码:
protected LocationRequest createLocationRequest() {
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(120000);
mLocationRequest.setFastestInterval(30000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
return mLocationRequest;
}
protected GoogleApiClient getLocationApiClient(){
return new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
LocationRequest locationRequest = createLocationRequest();
@Override
public void onLocationChanged(Location location) {
App.setLocation(location); // NEVER CALLED
}
@Override
public void onConnected(Bundle bundle) {
App.setLocation(LocationServices.FusedLocationApi.getLastLocation(locationApiClient)); //RETURNS NULL
LocationRequest locationRequest = createLocationRequest();
LocationServices.FusedLocationApi.requestLocationUpdates(locationApiClient, locationRequest, this);
}
Run Code Online (Sandbox Code Playgroud)
在onCreate我的应用程序上:
locationApiClient = getLocationApiClient(); …Run Code Online (Sandbox Code Playgroud) android android-location android-4.4-kitkat fusedlocationproviderapi android-fusedlocation
我想定期(比如每2分钟)当前位置更新为这个我下面的官方文档,我写了这个代码,但它不会给当前的位置即使在我传递requestLocationUpdates LocationRequest对象指定每两分钟更新( ),这里是代码:
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{
private FusedLocationProviderClient FusedLocationClient;
private GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
SupportMapFragment map =
getSupportFragmentManager().findFragmentById(R.id.map));
map.getMapAsync(this);
FusedLocationClient LocationServices.getFusedLocationProviderClient(this);
}
@Override
public void onConnected(Bundle bundle) {
FusedLocationClient.getLastLocation()
.addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
if (location != null) {
Log.i("MainActivity ", "" + location.getLongitude())
}
}
});
FusedLocationClient = …Run Code Online (Sandbox Code Playgroud) java android google-maps-android-api-2 android-fusedlocation
我使用LocationManager跟踪用户当前位置.现在,在将位置管理器更改为FusedLocation API之后,即使在设置之后也不会显示蓝点和圆圈map.setMyLocationEnabled(true).我可以在地图片段的右上角看到当前位置图标,但点击它不会做任何事情.我将我的代码恢复到LocationManager现在我能够看到指向我当前位置的蓝点.使用Fused Location API可能有什么问题.
我开发了一个用于查找设备当前位置的应用程序.我使用了Fused Location API来获取当前位置.
我面临着一个非常奇怪的问题,在一些设备中我得不到准确的当前位置,直到我打开内置谷歌地图,一旦我打开谷歌地图并返回我的应用程序,那时应用程序返回确切的位置.
这是我的位置请求.
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL);
mLocationRequest.setFastestInterval(FATEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setSmallestDisplacement(DISPLACEMENT); // 10 meters
Run Code Online (Sandbox Code Playgroud)
谁能告诉我有什么不对?非常感谢您的帮助.
我有一个Android应用程序获取位置:
private LocationRequest createLocationRequest() {
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(120000);
mLocationRequest.setFastestInterval(60000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
return mLocationRequest;
}
private GoogleApiClient getLocationApiClient(){
return new GoogleApiClient.Builder(App.instance)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
...
apiClient = getLocationApiClient();
apiClient.connect();
@Override
public void onConnected(@Nullable Bundle bundle) {
...
LocationRequest locationRequest = createLocationRequest();
LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, locationRequest, new LocationListener() {
@Override
public void onLocationChanged(Location newLocation) {
//***THIS IS NEVER CALLED ON EMULATOR***
}
});
}
Run Code Online (Sandbox Code Playgroud)
在设备上运行时(Galaxy S3,Android 4.4.4)完全没有问题.在模拟器上运行时(Android Studio默认qemu,Android 7.1,x86-64)我没有在我的应用程序上获取位置.onConnected被调用,我甚至可以读取最后一个位置,但我不会得到任何位置更新(requestLocationUpdates完成从未调用).
我有:
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />到清单(除了粗略和精细的位置).android location android-emulator fusedlocationproviderapi android-fusedlocation
我正在使用Fused location Api,我的位置精度约为10米.有时它可以提供4到8米的精度.我希望使用这个融合位置Api或任何其他方式更准确.有没有办法获得精度低于4米的位置.
我正以这种方式获得位置.
public class GetCurrentLocation implements
ConnectionCallbacks, OnConnectionFailedListener, LocationListener {
private static final String TAG = "location-updates-sample";
public static final long UPDATE_INTERVAL_IN_MILLISECONDS = 0;
public static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS =
UPDATE_INTERVAL_IN_MILLISECONDS / 2;
private final String REQUESTING_LOCATION_UPDATES_KEY = "requesting-location-updates-key";
private final String LOCATION_KEY = "location-key";
private final String LAST_UPDATED_TIME_STRING_KEY = "last-updated-time-string-key";
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private Context mContext;
private getLocation mGetCurrentLocation;
public GetCurrentLocation(Context context) {
mContext = context;
buildGoogleApiClient();
}
private synchronized void buildGoogleApiClient() {
Log.i(TAG, …Run Code Online (Sandbox Code Playgroud) android google-maps fusedlocationproviderapi android-fusedlocation
关于这个主题可能有类似的问题,但我需要你对一些具体要求的想法和建议.
这是我的需要 - 我们正在开发一个跟踪用户旅行的应用程序.该应用程序将开始在后台收集该用户的位置,当用户从App.Background Service"开始"他的旅程时,将根据用户在特定持续时间内的移动来获取位置.当用户"从应用程序停止"他的行程时,我们正在计算用户在所有记录位置的帮助下行进的距离(使用Google距离计算API).该应用程序在理想情况下工作正常.但主要的挑战是 - 在某些情况下,我们无法获取用户的准确和精确位置.影响的场景是 - 没有互联网,2g/3g的数据计划,GPS没有返回准确数据的某些特定区域等.
lat-long数据不正确会导致跳闸距离和路线不正确.这是App的主要问题.
请问,任何人都可以建议最好的选择/建议吗?PS - 我们尝试过GPS,网络,FusedLocationProvider.
编辑2 -
我们已经在准确性和距离的基础上实现了逻辑.更接近点.而且刚刚从谷歌那里找到了一个有用的api来纠正一些与实际道路分散注意力的位置点.在此发布以供其他人参考......
我在 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
甚至有可能吗?我希望能够创建一个侦听器,该侦听器将收到有关位置权限更改的通知(无论应用程序是否触发它们)。据我所知,有获取当前权限状态的方法和请求权限的方法,但没有任何方法可以简单地允许应用程序监听更改。
例如,在 iOS 中,我们可以在 a 上设置一个委托,CLLocationManager然后通过locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)在授权状态的任何更改上调用该委托。有谁知道 Android 中的任何等价物(最好与 API >= 17 兼容)?
android ×10
java ×3
location ×2
android-gps ×1
deprecated ×1
fusedlocationproviderclient ×1
google-maps ×1
kotlin ×1