如何获取当前位置?

时间:2018-03-17 21:37:43

标签: android kotlin

在Android中确定设备当前位置的最简单最短的方法是什么?一个近似的城市级位置足够好,我需要Lat / Long坐标,而不是名称。想想天气的位置。但是我用它来进行日出/日落计算。

StackOverflow和Web上的所有其他示例至少有一页长并且依赖于回调。但我正处于一个表面绘制功能的中间,不能等待回调。我只是想得到最后一个已经位于内存中某处的已知位置。

一个答案将我指向LocationManager.getLastKnownLocation(),但Android Studio表示它不知道该方法。所以它可能已经过时,并从更新的API中删除。

我是Android开发的新手,并且不知道在哪里搜索。网页片段把我带到了这里,但这一次没有了。

3 个答案:

答案 0 :(得分:3)

  

但是我正处于监视面部绘制功能的中间,不能等待回调。

您经常无法选择。

  

我只想获得最后一个已知位于内存中的位置。

它经常不在记忆中。

  

一个答案将我指向了LocationManager.getLastKnownLocation(),但Android Studio表示它不知道该方法。

该方法存在,如the documentation for that method中所示。

由于您的问题没有您正在尝试的代码,因此任何人都很难帮助解释代码未编译的原因。也许您试图在getLastKnownLocation()类上调用LocationManager,而不是LocationManager的实例。

请注意getLastKnownLocation()经常返回null,因为设备通常不会主动跟踪用户位置。此外,用户可能已禁用位置访问,或者设备可能处于飞行模式(因此无法访问非GPS源),或者设备可能位于导致蹩脚信号的设施中(例如,大型停车结构) )等等。

您也可以使用Play服务'fused location provider,但需要回调。

答案 1 :(得分:1)

在表盘中间绘制功能与否应该不会产生影响。 您在网上找到的大多数片段确实会告诉您使用回调。不是因为在某些情况下它“好”,而是因为它 系统如何工作。

在高层次上:

您可以让系统知道您对设备的位置感兴趣。

然后系统开始计算信息。

当确定一个位置,然后每次位置变化足够大(通过准确性定义)时,系统会告诉您现在设备的实际位置(通过这些回调)。


我的建议:

创建表盘渲染器时开始实现此逻辑。可以选择显示“未知位置”(如@CommonsWare所述,由于各种原因,位置可能无法使用)。并以最适合的方式(最终)存储最后知道的位置(SharedPref听起来像是一个不错的选择)。

答案 2 :(得分:-2)

将这些权限添加到manifest.xml

在您的活动中实现LocationListener,此类中的方法将为您提供有关Android设备位置更新的更新

@Override
public void onLocationChanged(Location location) {

}

在活动的oncreate方法中调用此startGettingLocations方法,以便可以从用户请求所需的所有权限

private void startGettingLocations() {
        Log.i("Process", "start getting locations");
        LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        boolean isGPS = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        boolean isNetwork = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        boolean canGetLocation = true;
        int ALL_PERMISSIONS_RESULT = 101;
        long MIN_DISTANCE_CHANGE_FOR_UPDATES = 100;// Distance in meters
        long MIN_TIME_BW_UPDATES = 1000 * 10 * 6 ;// Time in milliseconds

        ArrayList<String> permissions = new ArrayList<>();
        ArrayList<String> permissionsToRequest;

        permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
        permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
        permissionsToRequest = findUnAskedPermissions(permissions);

        //Check if GPS and Network are on, if not asks the user to turn on
        if (!isGPS && !isNetwork) {
            showSettingsAlert();
        } else {
            // check permissions
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (permissionsToRequest.size() > 0) {
                    requestPermissions(permissionsToRequest.toArray(new String[permissionsToRequest.size()]),
                            ALL_PERMISSIONS_RESULT);
                    canGetLocation = false;
                }
            }
        }

        if(ActivityCompat.checkSelfPermission(this,
                android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            Log.i("Permissions", "fine loc not granted");
        } else{
            Log.i("Permissions", "fine loc granted");
        }

        if(ActivityCompat.checkSelfPermission(this,
                android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            Log.i("Permissions", "coarse loc not granted");
        } else{
            Log.i("Permissions", "coarse loc granted");
        }

        if (ActivityCompat.checkSelfPermission(this,
                android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
                ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION)
                        != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "Permission not Granted", Toast.LENGTH_SHORT).show();
            return;
        }

        //Starts requesting location updates
        if (canGetLocation) {
            if (isGPS) {
                lm.requestLocationUpdates(
                        LocationManager.GPS_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

            } else if (isNetwork) {
                // from Network Provider
                lm.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
            }
        }
        else{
            Toast.makeText(this, "Can't get location", Toast.LENGTH_SHORT).show();
        }
    }