【问题标题】:Get Location Synchronously In Function Call Android在函数调用Android中同步获取位置
【发布时间】:2021-02-21 22:41:02
【问题描述】:

我正在尝试使用 Android 获取用户的最后一个已知位置。我可以使用融合位置来做到这一点,但我正在尝试制作一个简单的方法来返回用户的纬度和经度位置。

这是我尝试过的:

    public static double[] getLocation (Context c) {
        final double[] returnLocation = {0, 0};
        FusedLocationProviderClient fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(c);
        if (c.getApplicationContext().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            fusedLocationProviderClient.getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {
                    if (location != null) {
                        returnLocation[0] = location.getLatitude();
                        returnLocation[1] = location.getLongitude();
                    }
                }
            });
        }
        return returnLocation;
    }

但是,我担心这是异步的,所以它在没有实际获取位置的情况下返回。

感谢您的帮助。

【问题讨论】:

  • 按照定义,你想要的都是不可能的。您可以尝试获取最后一个已知位置,尽管这可能是null。否则,您需要考虑到确定位置可能需要一些时间。在某些情况下,它可能不会成功(例如,电话在大型建筑物内)。这就是为什么用于查找位置的 API 是异步的。

标签: java android location fusedlocationproviderapi


【解决方案1】:

getLastLocation用于获取缓存中的位置信息,如果没有缓存信息,则返回null

【讨论】:

    【解决方案2】:

    你可以这样做,我会每2秒触发一次这个方法,直到我得到最后一个位置。

    private void setFusedLocationProviderClient() {
            fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            final Task<Location> locationResult = fusedLocationProviderClient.getLastLocation();
            locationResult.addOnCompleteListener(this, task -> {
                if (task.isSuccessful()) {
                    // Set the map's camera position to the current location of the device.
                    if (task.getResult() != null) {
                        //Success
                    } else {
                        //Create delay
                        CreateDelay(2000, this::setFusedLocationProviderClient);
                    }
                }
            });
        }
    

    【讨论】:

      猜你喜欢
      • 2016-11-03
      • 2017-05-09
      • 2023-03-11
      • 2012-07-25
      • 2020-12-20
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多