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 有服务的任何地方工作。
我只是想写一个 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 有服务的任何地方工作。