我如何获得我在 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 中获取位置管理器的最后一个已知位置?

Android模拟器GPS位置给出了错误的时间

Android怎么实现点击按钮获取当前位置的信息,没有地图的情况下。

使用 onConnected() 显示最后一个已知位置

如果获取Android中的最后一个横幅,如何再次回到横幅

如何获得具有已知名称的列左侧的列名称?