Android 位置对象始终为空

Android Location Object Always Null

我只是想写一个 returns 纬度和经度的方法。我有一个带有按钮和两个文本字段的 activity。 java class 我正在使用扩展 AppCompatActivity 并实现 LocationListener 当按下按钮时按下以下方法:

public void startGPS(View view)
{

        // Here is the code to handle permissions - you should not need to edit this.
        if ( Build.VERSION.SDK_INT >= 23 &&
                ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
                ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[] { android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION }, TAKE_PHOTO_PERMISSION);
        }

        Location location = locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 0, this);
}

稍后,我尝试在 onLocationChanged 方法中打印出我的位置,但它导致应用程序崩溃。我 运行 通过调试器发现位置总是 null.

我试过 this solution 但没成功。其他示例在 onResume 中调用函数,但我真的需要它在 startGPS 方法中。

另外,有没有可能是我的设备出了问题?我 运行 在 Nexus 7 上安装它,当我 运行 Google 地图时似乎没有任何问题。

因为 Android 在没有应用程序请求时不跟踪位置,以节省电量。 GetLastKnownLocation 几乎总是 return 为空。如果您想要有保证的非空响应,请使用 requestLocationUpdates 或 requestSingleLocation。不过,这两者都是异步的,因此它们会在找到位置时调用回调(实际上找出位置可能需要几秒到一两分钟,具体取决于位置提供者的类型、大气条件、视线问题等。如果使用 GPS 并在内部,它实际上永远不会发生。)

如果在按下按钮后尝试 return GPS 坐标,您可能还没有存储现有的 GPS 位置。您应该使用 requestLocationUpdates 而不是 getLastKnownLocation.

locationManager.requestLocationUpdate(LocationManager.NETWORK_PROVIDER, 5000, 0, locationListener)

当您使用 requestLocationUpdate 时,它会自动为您调用 onLocationChanged,因此您无需在代码中调用它。

您可以将 LocationManager.NETWORK_PROVIDER 替换为 LocationManager.GPS_PROVIDER,但只要您有 WiFi 连接,您就应该能够获取坐标。

如果你想在内部使用它,请尝试将 GPS_PROVIDER 切换为 NETWORK_PROVIDER;这将在 phone 有服务的任何地方工作。