Android 位置对象始终为空
Posted
技术标签:
【中文标题】Android 位置对象始终为空【英文标题】:Android Location Object Always Null 【发布时间】:2017-08-19 12:23:01 【问题描述】:我只是想写一个返回纬度和经度的方法。我有一个带有按钮和两个文本字段的活动。我正在使用的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 上运行它,运行 Google 地图时似乎没有任何问题。
【问题讨论】:
***.com/a/43016257/5993410 @AtefHares 是的,我已经把它们放在我的清单中了。 【参考方案1】:如果在按下按钮后尝试返回 GPS 坐标,则很可能您尚未存储现有的 GPS 位置。您应该使用requestLocationUpdates
而不是getLastKnownLocation
。
locationManager.requestLocationUpdate(LocationManager.NETWORK_PROVIDER, 5000, 0, locationListener)
当您使用requestLocationUpdate
时,它会自动为您调用onLocationChanged
,因此您无需在代码中调用它。
您可以将LocationManager.NETWORK_PROVIDER
替换为LocationManager.GPS_PROVIDER
,但只要您有WiFi连接,您应该能够获取坐标。
【讨论】:
【参考方案2】:如果您尝试在内部使用它,请尝试将GPS_PROVIDER
切换为NETWORK_PROVIDER
;这将适用于手机有服务的任何地方。
【讨论】:
【参考方案3】:因为 Android 在没有应用请求时不会跟踪位置,以节省电量。 GetLastKnownLocation 几乎总是返回 null。如果您想要有保证的非空响应,请使用 requestLocationUpdates 或 requestSingleLocation。但这两者都是异步的,因此它们会在找到位置时调用回调(实际上,确定位置可能需要几秒钟到一两分钟,具体取决于位置提供者的类型、大气条件、视线问题等。如果使用 GPS 并且在内部它实际上永远不会发生。)
【讨论】:
我以前从未见过。我试图将其更改为Location location = locationManager.requestLocationUpdates("gps", 5000, 0, locationListener)
,但Android Studios 在其下绘制了一条运行线并显示Incompatible types
立即返回的值无济于事。它是您在调用位置侦听器回调时得到的一个,它确保非空,因为 requestXXX 函数实际上打开了跟踪。 getLastKnownLocation 可以检查并用作优化,但不应依赖,并且绝对不应用于检查其位置是否正在更改。
对不起,我不明白,我的实现有什么问题?我应该改变什么?
第一个参数应该是 LocationManager.GPS_PROVIDER。它不返回值——locationListener 稍后将在准备好时使用值调用。
所以我不应该将它设置为等于任何东西。但是,现在我已经完成了我的应用程序崩溃并且没有任何内容被打印到日志中。应用终止前的最后一条消息是Connected to process 5726 on device asus-nexus_7-06df827f
以上是关于Android 位置对象始终为空的主要内容,如果未能解决你的问题,请参考以下文章
在 Android N 中调用位置时出现空点异常。 [重复]