我试图通过使用FusedLocationApi.getLastLocation
获取位置,并且在清单文件中获得了位置权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
但是,当我从系统请求位置时,我将得到null
。我只是在测试关机和定位服务,所以它可能与此相关(当然,当我尝试这个时,它是打开的)。但是,即使在返回null之后,我也在等待调用onLocationChanged
,而它从未被调用。我在这里也看到了一个类似的问题:FusedLocationApi.getLastLocation总是空的
这是我的代码:
protected LocationRequest createLocationRequest() {
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(120000);
mLocationRequest.setFastestInterval(30000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
return mLocationRequest;
}
protected GoogleApiClient getLocationApiClient(){
return new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
LocationRequest locationRequest = createLocationRequest();
@Override
public void onLocationChanged(Location location) {
App.setLocation(location); // NEVER CALLED
}
@Override
public void onConnected(Bundle bundle) {
App.setLocation(LocationServices.FusedLocationApi.getLastLocation(locationApiClient)); //RETURNS NULL
LocationRequest locationRequest = createLocationRequest();
LocationServices.FusedLocationApi.requestLocationUpdates(locationApiClient, locationRequest, this);
}
在我的应用程序onCreate
上:
locationApiClient = getLocationApiClient();
locationApiClient.connect();
其中this
是我的应用程序对象。为什么我要获得null (是的,我知道在文档中提到的一些罕见情况下它可能是空的,但我总是得到这个,而不是很少)和之后仍然没有得到位置更新?这是一个真正的设备(三星银河S3),如果有帮助的话,它没有SIM卡。
发布于 2015-04-22 17:08:40
融合位置提供程序仅在至少一个客户端连接到它时才会维护后台位置。现在,仅仅打开location服务并不能保证存储最后一个已知的位置。
一旦第一个客户端连接,它将立即尝试获得一个位置。如果您的活动是连接的第一个客户端,并且在getLastLocation()中立即调用onConnected(),那么可能没有足够的时间到达第一个位置。
然后设置mLocationRequest.setFastestInterval(30000);
,这意味着30秒。所以至少30秒后,通常根据你的设置,首选时间是120秒,如果根本没有存储的最后一个已知的位置,这不是很长的时间吗?此外,您正在设置电池平衡优先级,这将使您等待更长的时间。
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
我建议你先启动地图应用程序,这样至少有一些确定的位置,然后测试你的应用程序。
发布于 2015-04-22 12:43:26
我在我的应用程序中使用了FusedLocationProvider api,这是我在设备和模拟器上工作的代码-
@Override
protected void onCreate(Bundle savedInstanceState){
//put your code here
....
getLocation();
}
private void getLocation(){
locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(LOCATION_INTERVAL);
locationRequest.setFastestInterval(LOCATION_INTERVAL);
fusedLocationProviderApi = LocationServices.FusedLocationApi;
googleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
if (googleApiClient != null) {
googleApiClient.connect();
}
}
@Override
public void onConnected(Bundle arg0) {
fusedLocationProviderApi.requestLocationUpdates(googleApiClient, locationRequest, this);
}
@Override
public void onLocationChanged(Location location) {
Toast.makeText(mContext, "location :"+location.getLatitude()+" , "+location.getLongitude(), Toast.LENGTH_SHORT).show();
}
这是我的工作代码。
希望我的密码能帮你。
干杯..。
发布于 2016-03-24 14:58:33
如果它返回null,这意味着您需要在检索位置之前使用LocationServices.FusedLocationApi.requestLocationUpdates开始接收位置更新。
对我来说,解决这个问题的一个办法是叫:
LocationServices.FusedLocationApi.requestLocationUpdates(locationApiClient,locationRequest, this);
在下列会议之前:
App.setLocation(LocationServices.FusedLocationApi.getLastLocation(locationApiClient));
问题是最后一个位置不存在,所以它是空的。
如果问题持续存在,请尝试如下:
检查必要的权限。
确保已在设备上启用位置,然后重新启动。
https://stackoverflow.com/questions/29796436
复制相似问题