我正在使用 FusedLocationProviderClient 进行位置请求。我保留了一个计时器30秒,以检查在该时间范围内是否收到位置。 代码如下:
public void requestLocationUpdates() {
initializeLocationRequest();
mFusedLocationProviderClient.requestLocationUpdates(mLocationRequest, mLocationCallback, null);
startTimer();
}
private void initializeLocationRequest() {
mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(mContext);
mLocationRequest = new LocationRequest();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(5000);
mLocationRequest.setFastestInterval(5000);
mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
synchronized (SilentCurrentLocationProvider.this) {
super.onLocationResult(locationResult);
Location location = locationResult.getLastLocation();
}
};
}
private void startTimer() {
if (mTimeout < 1) {
mTimeout = mDefaultTimeout;
}
mTimer = new Timer();
mTimer.schedule(new LocationTimer(), mTimeout * 1000);
}
在少数设备上,位置不会到来。在进一步调试时,我发现正在创建 LocationRequest 和 LocationCallback ,但它不会进入 onLocationResult()方法。
由于这是实时产品的一部分,因此很难在每台设备上进行调试。 即使我尝试重新启动手机,但它无法正常工作。用户尝试了其他应用程序,如Ola和位置即将到来。
位置权限也已提供。
有谁可以告诉我这个问题的可能原因?
答案 0 :(得分:3)
您只需要请求以下权限:
Manifest.permission.ACCESS_FINE_LOCATION
我遇到了同样的问题,并且同时要求使用以下两个权限:
Manifest.permission.ACCESS_COARSE_LOCATION
当我删除粗略位置后,我几乎立即获得了更新。
答案 1 :(得分:1)
我也面临着同样的问题。在我的情况下,设备定位方法/准确性设置为仅手机,而不是高精度或省电。将设置更改为高精度,并在locationCallback
上接收回调。
答案 2 :(得分:1)
在装有Android Pie的手机上也有同样的问题。授予了位置许可(通常通过转到应用程序设置),并且位置信息的准确性很高,但未获得位置更新。 在我添加代码以检查请求位置更新之前是否已授予位置权限后,此问题已解决。
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted. Request for permission
}
答案 3 :(得分:1)
关闭位置后,这发生在我身上。不是应用程序的位置权限,而是android设备本身的位置。要求用户激活GPS为我修复它:
protected void onCreate(Bundle savedInstanceState) {
//...
final LocationManager manager = (LocationManager) getSystemService( Context.LOCATION_SERVICE );
if ( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
buildAlertMessageNoGps();
}
}
private void buildAlertMessageNoGps() {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Your GPS seems to be disabled, do you want to enable it?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
dialog.cancel();
}
});
final AlertDialog alert = builder.create();
alert.show();
}
来自here的解决方案。
您可能还需要先关闭GPS,然后再打开,以触发对话框以提高定位精度:
答案 4 :(得分:0)
尝试将LocationCallback放置为“ onCreate()”方法。