Android位置对象始终为空

时间:2017-03-26 22:48:31

标签: java android android-studio gps android-gps

我只想编写一个返回纬度和经度的方法。我有一个带有按钮和两个文本字段的活动。我正在使用的java类扩展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上运行它,当我运行谷歌地图时似乎没有任何问题。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

您可以将LocationManager.NETWORK_PROVIDER替换为LocationManager.GPS_PROVIDER,但只要您有WiFi连接,就​​可以获得坐标。

答案 2 :(得分:0)

如果要在内部使用此功能,请尝试将GPS_PROVIDER切换为NETWORK_PROVIDER;在手机可以服务的任何地方都可以使用。