【问题标题】:How do i get my last known location in android?我如何获得我在 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 中收到回调?

标签: android


【解决方案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


    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      相关资源
      最近更新 更多