如何在不跟踪的情况下只获取一次用户位置?
Posted
技术标签:
【中文标题】如何在不跟踪的情况下只获取一次用户位置?【英文标题】:How to get user location only once without tracking? 【发布时间】:2017-04-14 07:46:43 【问题描述】:在我的 android 应用程序中,当他单击按钮时,我需要 gt 用户位置。不过,我不需要收到关于他位置的持续更新。
我在 *** 上搜索了几个问题,但答案是 2-3 年前的,所以我想知道,就像现在在 Android SDK 上一样,最好的方法是什么。
另外,如果可能的话,我不想在该位置获得null
。
提前致谢。
【问题讨论】:
可能与***.com/questions/6694391/…重复 这个问题是 5 年前提出的,所以答案可能已经过时了 【参考方案1】:2020 年 9 月 23 日更新
Change log of version 17.1.0 提到了一种获取当前位置的新方法:
FusedLocationProviderClient.getCurrentLocation()
如果可以在合理的时间(几十秒)内确定设备位置,则返回单个新位置,否则返回 null。 此方法可能会返回几秒钟前的位置,但永远不会返回更旧的位置。这适用于需要一个新的当前位置的前台应用程序。
文档:https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderClient#getCurrentLocation(int,%20com.google.android.gms.tasks.CancellationToken)
使用示例:
val cancellationTokenSource = CancellationTokenSource()
fusedLocationProviderClient.getCurrentLocation(LocationRequest.PRIORITY_HIGH_ACCURACY, cancellationTokenSource.token)
// onStop or whenever you want to cancel the request
cancellationTokenSource.cancel()
旧答案
您可以使用setNumUpdates
方法并传递值1。
示例:
mLocationRequest = new LocationRequest();
mLocationRequest.setNumUpdates(1);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
默认情况下,位置会不断更新,直到请求被明确删除,但是您可以选择请求一定数量的更新。例如,如果您的应用程序只需要一个新位置,则在将请求传递给位置客户端之前调用此方法并使用值为 1。
https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#setNumUpdates(int)
【讨论】:
来自文档:“使用此选项时,必须注意在不再需要时显式删除请求或使用 (setExpirationDuration(long) 或 setExpirationTime(long) 设置过期。否则在某些在无法计算位置的情况下,此请求可能会无限期保持活动状态并消耗电量。” 你好,我发现如果你设置“setNumUpdates(1)”它不会得到位置,你必须设置它至少为2。我正在使用:“LocationServices.getFusedLocationProviderClient(mActivity ).requestLocationUpdates(mLocationRequest, mLocationCallback, null); " ......不是 "getCurrentLocation"。 @Z3R0 我认为这不是真的.. 这可能是您代码中的错误。我已经使用setNumUpdates(1)
很长时间了,它工作正常。
@AhmadEl-Melegy 我也在使用,但现在它不再工作了。如果因为我已经更新了目标 sdk 或库,但如果我删除“setNumUpdates”或者我将其设置为 > 1,代码就可以工作。
我确认“您必须将其设置为至少 2”的情况。【参考方案2】:
Android 在上一届 I/O 峰会上介绍了 Fused Location,Fused Location 为您提供更可靠、更准确的位置以及最佳的可用提供商。
import android.location.Location;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, LocationListener
TextView txtOutputLat, txtOutputLon;
Location mLastLocation;
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
String lat, lon;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GoogleApiClient();
@Override
public void onConnected(Bundle bundle)
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(100); // Update location every second
//use if you want location update
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
// here you get current location
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
mGoogleApiClient);
if (mLastLocation != null)
lat = String.valueOf(mLastLocation.getLatitude());
lon = String.valueOf(mLastLocation.getLongitude());
@Override
public void onConnectionSuspended(int i)
@Override
public void onLocationChanged(Location location)
lat = String.valueOf(location.getLatitude());
lon = String.valueOf(location.getLongitude());
@Override
public void onConnectionFailed(ConnectionResult connectionResult)
GoogleApiClient();
synchronized void GoogleApiClient()
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
@Override
protected void onStart()
super.onStart();
mGoogleApiClient.connect();
@Override
protected void onDestroy()
super.onDestroy();
mGoogleApiClient.disconnect();
【讨论】:
请注意,如果你想每秒更新一次,`mLLocationRequest.setInterval(100);`实际上应该是`mLLocationRequest.setInterval(1000);` 问题是只获取一次位置,而不是每秒获取一次【参考方案3】:<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
if (mGoogleApiClient == null)
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
protected void onStart()
mGoogleApiClient.connect();
super.onStart();
protected void onStop()
mGoogleApiClient.disconnect();
super.onStop();
public class MainActivity extends ActionBarActivity implements
ConnectionCallbacks, OnConnectionFailedListener
@Override
public void onConnected(Bundle connectionHint)
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
mGoogleApiClient);
if (mLastLocation != null)
mLatitudeText.setText(String.valueOf(mLastLocation.getLatitude()));
mLongitudeText.setText(String.valueOf(mLastLocation.getLongitude()));
供进一步参考see here
【讨论】:
以上是关于如何在不跟踪的情况下只获取一次用户位置?的主要内容,如果未能解决你的问题,请参考以下文章
MKUserTrackingButton - 如何在不缩小的情况下获取用户位置的中心地图?