我如何获得我在 android 中的最后一个已知位置?
Posted
技术标签:
【中文标题】我如何获得我在 android 中的最后一个已知位置?【英文标题】:How do i get my last known location in android? 【发布时间】:2016-07-30 11:16:28 【问题描述】:我正在使用 google play 服务来获取我最后的位置。该项目在没有强制关闭的情况下运行良好,但是,它永远不会得到任何位置。我认为它不需要 GPS 或移动网络,因为 google play 服务已经基于这两种策略获得了我的最后一个位置。我的代码应该在文本字段中设置我的位置。但它没有
public class MainActivity extends Activity implements
ConnectionCallbacks, OnConnectionFailedListener
GoogleApiClient mGoogleApiClient;
Location mLastLocation;
TextView tvLatlong;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvLatlong = (TextView) findViewById(R.id.textView1);
buildGoogleApiClient();
if(mGoogleApiClient!= null)
mGoogleApiClient.connect();
else
Toast.makeText(this, "Not connected...", Toast.LENGTH_SHORT).show();
@Override
public void onConnectionFailed(ConnectionResult arg0)
Toast.makeText(this, "Failed to connect...", Toast.LENGTH_SHORT).show();
@Override
public void onConnected(Bundle arg0)
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
mGoogleApiClient);
if (mLastLocation != null)
tvLatlong.setText("Latitude: "+ String.valueOf(mLastLocation.getLatitude())+"Longitude: "+
String.valueOf(mLastLocation.getLongitude()));
@Override
public void onConnectionSuspended(int arg0)
Toast.makeText(this, "Connection suspended...", Toast.LENGTH_SHORT).show();
protected synchronized void buildGoogleApiClient()
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
【问题讨论】:
您是否在 Onconnected 中收到回调? 【参考方案1】:GetLastLocation
由 FusedLocationApi 调用,并根据使用它的最后一个客户端存储最后一个位置。如果您的应用是第一个使用它的客户端,它可能不会像您调用“OnConnected()”函数那样快地获得最后一个位置。
您有一些潜在的选择:
1.创建一个检查线程
您可以实现一个线程,每 X 秒检查一次最后一个已知位置。然后,无论您的应用程序是否是第一个启动的,您最终都会收到最后一个位置。
2。实施位置监听
您还可以在您的活动中实现位置侦听,并在每次触发 OnLocationChanged
事件时更新您的位置。
【讨论】:
如果我运行一次谷歌地图应用程序并找到自己,它会得到我最后的位置吗? 另外,“1. 创建一个检查线程” - 我应该在我的线程中调用什么方法? 你应该调用你的 getLastLocation() 方法。【参考方案2】:第一个 onConnected 不会立即被调用。这需要一些时间,具体取决于各种因素。所以保留一个日志语句并检查何时调用 onConnected。
此外,如果设备位置已关闭,那么您将永远不会收到任何返回的数据。它将为空。
此外,无论您是否连接到互联网,google api 客户端都没有必要保存您的最后位置。它可能也可能不会。它只缓存最后一个位置,并且可以随时被安卓操作系统清除。
【讨论】:
【参考方案3】:注意:我在 2020 年写这个答案,获取当前位置/最后一个已知位置(两者或多或少相同)的最简单方法是使用 "FusedLocationProviderClient"。
首先,我们需要在 build.gradle 文件中为 location 实现以下 google play 服务依赖:
implementation com.google.android.gms:play-services-location:17.0.0
在清单文件中添加权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
然后在我们的活动中声明一些变量和常量,如下所示:
private lateinit var fusedLocationClient: FusedLocationProviderClient
private val PERMISSIONS_REQUEST_LOCATION = 1
然后在onCreate中,从LocationServices获取FusedLocationProviderClient:
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
然后我们可以使用下面的“getCurrentLocation()”方法向用户询问位置权限,并在用户允许权限后获取当前位置:
private fun getCurrentLocation()
if (ActivityCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_COARSE_LOCATION
) != PackageManager.PERMISSION_GRANTED
)
ActivityCompat.requestPermissions(
this,
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
),
PERMISSIONS_REQUEST_LOCATION
)
return
fusedLocationClient.lastLocation
.addOnSuccessListener location : Location? ->
Toast.makeText(this, "Latitude: $location?.latitude, Longitude: $location?.longitude", Toast.LENGTH_SHORT).show()
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
)
if (requestCode == PERMISSIONS_REQUEST_LOCATION)
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED)
getCurrentLocation()
else
Toast.makeText(this, "You need to allow the permissions for Location", Toast.LENGTH_SHORT).show()
return
更多详情请参考: https://developer.android.com/training/location/retrieve-current
【讨论】:
以上是关于我如何获得我在 android 中的最后一个已知位置?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 中获取位置管理器的最后一个已知位置?