标签: android-fusedlocation

Android LocationServices.FusedLocationApi已弃用

我无法弄清楚为什么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)

java android deprecated android-fusedlocation

74
推荐指数
2
解决办法
7万
查看次数

为什么FusedLocationApi.getLastLocation为null

我试图通过使用获取位置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

36
推荐指数
3
解决办法
5万
查看次数

如何使用FusedLocationProviderClient获取GoogleMap中的当前位置

我想定期(比如每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

25
推荐指数
2
解决办法
4万
查看次数

使用android融合位置api在MyLocation上不显示蓝点和圆圈

我使用LocationManager跟踪用户当前位置.现在,在将位置管理器更改为FusedLocation API之后,即使在设置之后也不会显示蓝点和圆圈map.setMyLocationEnabled(true).我可以在地图片段的右上角看到当前位置图标,但点击它不会做任何事情.我将我的代码恢复到LocationManager现在我能够看到指向我当前位置的蓝点.使用Fused Location API可能有什么问题.

android google-maps-android-api-2 android-fusedlocation

11
推荐指数
2
解决办法
3万
查看次数

应用程序获取错误的位置,直到打开内置的Google Map应用程序

我开发了一个用于查找设备当前位置的应用程序.我使用了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 android-fusedlocation

11
推荐指数
1
解决办法
1252
查看次数

Android应用无法使用FusedLocationApi访问模拟器上的位置

我有一个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" />到清单(除了粗略和精细的位置).
  • 尝试在模拟器上更改Google位置设置(高精度,省电,仅限设备) …

android location android-emulator fusedlocationproviderapi android-fusedlocation

11
推荐指数
1
解决办法
1265
查看次数

我想通过谷歌融合位置api获得准确的位置?

我正在使用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

8
推荐指数
2
解决办法
7195
查看次数

在背景中获取准确的中间位置点,并计算Android中起始位置和结束位置的距离

关于这个主题可能有类似的问题,但我需要你对一些具体要求的想法和建议.

这是我的需要 - 我们正在开发一个跟踪用户旅行的应用程序.该应用程序将开始在后台收集该用户的位置,当用户从App.Background Service"开始"他的旅程时,将根据用户在特定持续时间内的移动来获取位置.当用户"从应用程序停止"他的行程时,我们正在计算用户在所有记录位置的帮助下行进的距离(使用Google距离计算API).该应用程序在理想情况下工作正常.但主要的挑战是 - 在某些情况下,我们无法获取用户的准确和精确位置.影响的场景是 - 没有互联网,2g/3g的数据计划,GPS没有返回准确数据的某些特定区域等.

lat-long数据不正确会导致跳闸距离和路线不正确.这是App的主要问题.

请问,任何人都可以建议最好的选择/建议吗?PS - 我们尝试过GPS,网络,FusedLocationProvider.

编辑2 -

我们已经在准确性和距离的基础上实现了逻辑.更接近点.而且刚刚从谷歌那里找到了一个有用的api来纠正一些与实际道路分散注意力的位置点.在此发布以供其他人参考......

来自Google的Snap to Roads Api

android android-location android-fusedlocation android-gps

8
推荐指数
1
解决办法
552
查看次数

FusedLocationProviderClient getLastLocation elapsedRealtimeNanos 主要是当前系统时间

更新 2

我在 Google I/O '18 上与一位 Google 工程师进行了交谈。他告诉我,我可以信任 fusedLocationProvider。如果他用新的时间戳标记最后一个已知位置,则用户可能仍在同一位置。

我想在未来用一个“移动”的设备做一些测试来证明这个说法。


原始问题

我正在从FusedLocationProviderClientwith请求最后一个已知位置,getLastLocation()并想检查最后一个已知位置是否早于 5 分钟以开始新的位置请求。

在我的测试过程中,我发现了一个奇怪的行为与elapsedRealtimeNanos应该用来比较的位置。

出于测试目的,我在一个简单的 Java 线程中每秒请求最后一个已知位置。收到位置后,我检查 elapsedRealtimeNanos 并将它们与SystemClock.elapsedRealtimeNanos(). 在大多数情况下,最后一个已知位置的年龄也设置SystemClock.elapsedRealtimeNanos()为,因此差异接近 0。这意味着 FusedLocationProvider 告诉我最后一个已知位置的修复是现在,这使得年龄检查不可靠。

这种行为很奇怪,但它变得更糟。

当我在测试会话期间启动并行位置请求或启动 Google 地图时,elapsedRealtimeNanos最后一个已知位置的位置停止增长,只有在找到“真实”新位置时才会更新到更新的时间。这应该是我期望的默认行为。

我在 HIGH_ACCURACY 和 SENSORS_ONLY 等不同的位置设置中观察到了这种行为。

这是否意味着检查最后一个已知位置的年龄是不可能的?任何人都可以解释这种行为吗?

更新 1

相同的行为 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

8
推荐指数
1
解决办法
5392
查看次数

我们如何监听 Android 中的位置权限变化(不触发权限请求)?

甚至有可能吗?我希望能够创建一个侦听器,该侦听器将收到有关位置权限更改的通知(无论应用程序是否触发它们)。据我所知,有获取当前权限状态的方法和请求权限的方法,但没有任何方法可以简单地允许应用程序监听更改。

例如,在 iOS 中,我们可以在 a 上设置一个委托,CLLocationManager然后通过locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)在授权状态的任何更改上调用该委托。有谁知道 Android 中的任何等价物(最好与 API >= 17 兼容)?

java android android-location kotlin android-fusedlocation

7
推荐指数
1
解决办法
3838
查看次数