如何在不跟踪的情况下只获取一次用户位置?

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 - 如何在不缩小的情况下获取用户位置的中心地图?

如何在不使用核心位置服务的情况下获取用户当前的城市名称?

如何在不需要 rxjs-compat 的情况下只导入 RxJS 6 中使用的运算符,如旧的 RxJS?

如何在不使用谷歌地图和其他地图的情况下获取用户当前位置?

如何在不更改用户设置的缩放比例的情况下更新地图标记?