FusedLocationClient 不调用 onLocationResult
FusedLocationClient not calling onLocationResult
我正在创建一个位置客户端,目前我有
public void startUpdatingLocationProcess(Context context) {
parentContext = context;
if (mFusedLocationClient == null){
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(parentContext);
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(5000);
mLocationRequest.setFastestInterval(5000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
if (ContextCompat.checkSelfPermission(parentContext, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
{
mFusedLocationClient.requestLocationUpdates(mLocationRequest, new LocationCallback(){
@Override
public void onLocationResult(LocationResult locationResult) {
onLocationChanged(locationResult.getLastLocation());
}
} , Looper.myLooper());
}
}
这是在 LocationApi class 中,我想 运行 在整个应用程序生命周期中,这个特定的应用程序 运行 有很多活动,所以我不想 "recreate" 每次我销毁并创建一个新的请求时 activity.
允许并检查FINE_LOCATION的权限,logcat和代码运行在创建mFusedLocationClient对象的requestLocationUpdates方法中没有错误,但是它从不调用 "onLocationResult" 方法。
我在使用这个 api 时有什么遗漏吗?
在请求位置更新之前,您的应用必须连接到位置服务并发出位置请求。
像这样的事情:
private static LocationRequest createLocationRequest() {
LogHelper.trace("createLocationRequest");
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(200000);
mLocationRequest.setFastestInterval(300000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
return mLocationRequest;
}
public static void checkLocationService(final Fragment fragment, final FusedLocationProviderClient client, final OnSuccessListener<LocationSettingsResponse> successListener, OnFailureListener failureListener) {
LogHelper.trace("checkLocationService");
final LocationRequest request = createLocationRequest();
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(request);
SettingsClient settingsClient = LocationServices.getSettingsClient(fragment.getActivity());
Task<LocationSettingsResponse> task = settingsClient.checkLocationSettings(builder.build());
task.addOnSuccessListener(fragment.getActivity(), new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
LogHelper.trace("onSuccess");
startLocationService(client, request, new LocationCallback());
successListener.onSuccess(locationSettingsResponse);
}
});
task.addOnFailureListener(fragment.getActivity(), failureListener);
}
尝试从 android 设置中获取 active/desactive 位置。
location == null
.
另见 LocationAvailability No Location Available。如果你打电话
fusedLocationClient.getLocationAvailability()
.addOnSuccessListener(this, locationAvailability -> {
})
你会看到 LocationAvailability[isLocationAvailable: false]
.
可能是因为旧的模拟器或
locationRequest = LocationRequest.create();
locationRequest
.setNumUpdates(1)
.setFastestInterval(0)
.setSmallestDisplacement(0)
如果你设置setNumUpdates(1)
,它会return只协调一次,很可能会有null
。我删除了这些行并使用
@SuppressLint("MissingPermission")
private fun startLocationUpdates() {
fusedLocationProviderClient?.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
}
开始搜索位置,然后
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
super.onLocationResult(locationResult)
if (locationResult?.lastLocation == null) {
Timber.d("Location missing in callback.")
} else {
Timber.d(
"Location Callback ${locationResult.lastLocation}")
latitude = locationResult.lastLocation.latitude
longitude = locationResult.lastLocation.longitude
stopLocationUpdates()
}
}
}
fusedLocationProviderClient?.lastLocation
?.addOnSuccessListener { location ->
Timber.d("lastLocation success $location")
if (location == null) {
startLocationUpdates()
} else {
latitude = location.latitude
longitude = location.longitude
}
}
?.addOnFailureListener { failure ->
Timber.d("lastLocation failure ${failure.message}")
}
接收坐标。
我正在创建一个位置客户端,目前我有
public void startUpdatingLocationProcess(Context context) {
parentContext = context;
if (mFusedLocationClient == null){
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(parentContext);
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(5000);
mLocationRequest.setFastestInterval(5000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
if (ContextCompat.checkSelfPermission(parentContext, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
{
mFusedLocationClient.requestLocationUpdates(mLocationRequest, new LocationCallback(){
@Override
public void onLocationResult(LocationResult locationResult) {
onLocationChanged(locationResult.getLastLocation());
}
} , Looper.myLooper());
}
}
这是在 LocationApi class 中,我想 运行 在整个应用程序生命周期中,这个特定的应用程序 运行 有很多活动,所以我不想 "recreate" 每次我销毁并创建一个新的请求时 activity.
允许并检查FINE_LOCATION的权限,logcat和代码运行在创建mFusedLocationClient对象的requestLocationUpdates方法中没有错误,但是它从不调用 "onLocationResult" 方法。
我在使用这个 api 时有什么遗漏吗?
在请求位置更新之前,您的应用必须连接到位置服务并发出位置请求。 像这样的事情:
private static LocationRequest createLocationRequest() {
LogHelper.trace("createLocationRequest");
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(200000);
mLocationRequest.setFastestInterval(300000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
return mLocationRequest;
}
public static void checkLocationService(final Fragment fragment, final FusedLocationProviderClient client, final OnSuccessListener<LocationSettingsResponse> successListener, OnFailureListener failureListener) {
LogHelper.trace("checkLocationService");
final LocationRequest request = createLocationRequest();
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(request);
SettingsClient settingsClient = LocationServices.getSettingsClient(fragment.getActivity());
Task<LocationSettingsResponse> task = settingsClient.checkLocationSettings(builder.build());
task.addOnSuccessListener(fragment.getActivity(), new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
LogHelper.trace("onSuccess");
startLocationService(client, request, new LocationCallback());
successListener.onSuccess(locationSettingsResponse);
}
});
task.addOnFailureListener(fragment.getActivity(), failureListener);
}
尝试从 android 设置中获取 active/desactive 位置。
location == null
.
另见 LocationAvailability No Location Available。如果你打电话
fusedLocationClient.getLocationAvailability()
.addOnSuccessListener(this, locationAvailability -> {
})
你会看到 LocationAvailability[isLocationAvailable: false]
.
可能是因为旧的模拟器或
locationRequest = LocationRequest.create();
locationRequest
.setNumUpdates(1)
.setFastestInterval(0)
.setSmallestDisplacement(0)
如果你设置setNumUpdates(1)
,它会return只协调一次,很可能会有null
。我删除了这些行并使用
@SuppressLint("MissingPermission")
private fun startLocationUpdates() {
fusedLocationProviderClient?.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
}
开始搜索位置,然后
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
super.onLocationResult(locationResult)
if (locationResult?.lastLocation == null) {
Timber.d("Location missing in callback.")
} else {
Timber.d(
"Location Callback ${locationResult.lastLocation}")
latitude = locationResult.lastLocation.latitude
longitude = locationResult.lastLocation.longitude
stopLocationUpdates()
}
}
}
fusedLocationProviderClient?.lastLocation
?.addOnSuccessListener { location ->
Timber.d("lastLocation success $location")
if (location == null) {
startLocationUpdates()
} else {
latitude = location.latitude
longitude = location.longitude
}
}
?.addOnFailureListener { failure ->
Timber.d("lastLocation failure ${failure.message}")
}
接收坐标。