Can*_*ğlu 36 android android-location android-4.4-kitkat fusedlocationproviderapi android-fusedlocation
我试图通过使用获取位置FusedLocationApi.getLastLocation
,我在清单文件中获得了位置权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)
但是,null
当我从系统请求位置时,我得到了.我只是测试关闭和位置服务,所以它可能与此有关(当然,当我尝试这个时它是开启的).但即使在返回null之后,我也在等待onLocationChanged
被调用,而且它从未被调用过.我在这里也看到了类似的问题:FusedLocationApi.getLastLocation总是为null
这是我的代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
在onCreate
我的应用程序上:
locationApiClient = getLocationApiClient();
locationApiClient.connect();
Run Code Online (Sandbox Code Playgroud)
this
我的应用程序对象在哪里.为什么我会得到空(是的,我不知道它可能是在文件中规定了一些罕见的情况下是空的,但我总是得到这个,不是很少)和此后仍然没有得到位置更新?这是一个没有SIM卡的真实设备(三星Galaxy S3),如果有帮助的话.
Rav*_*ari 18
我在我的应用程序中使用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();
}
Run Code Online (Sandbox Code Playgroud)
这是我的工作代码.
希望我的代码可以帮到你.
干杯..
Ami*_*aha 18
如果至少有一个客户端连接到融合位置提供程序,则它仅保留后台位置.现在只需打开位置服务,就无法保证存储最后一个已知位置.
一旦第一个客户端连接,它将立即尝试获取位置.如果您的活动是第一个连接的客户端,并且在onConnected()中立即调用了getLastLocation(),那么第一个位置可能没有足够的时间到达..
然后你设置mLocationRequest.setFastestInterval(30000);
这基本上意味着30秒.所以至少30秒后,一般根据你的设置,首选时间是120秒,如果根本没有存储的最后已知位置,是不是很长时间?加上你正在设置电池平衡优先级,这将使你等待更长的时间.
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
Run Code Online (Sandbox Code Playgroud)
我建议您先启动Google地图应用,以便至少有一些确认位置,然后测试您的应用.
小智 5
如果它返回 null,这意味着您需要在检索位置之前开始使用 LocationServices.FusedLocationApi.requestLocationUpdates 接收位置更新。
对我来说,解决问题的方法是调用:
LocationServices.FusedLocationApi.requestLocationUpdates(locationApiClient,locationRequest, this);
之前:
App.setLocation(LocationServices.FusedLocationApi.getLastLocation(locationApiClient));
问题是最后一个位置不存在所以它是空的。
如果问题仍然存在,请尝试以下操作:
检查必要的权限。
确保您已在设备上启用位置,然后重新启动。
归档时间: |
|
查看次数: |
49257 次 |
最近记录: |