【问题标题】:FusedLocationClient not calling onLocationResultFusedLocationClient 未调用 onLocationResult
【发布时间】:2019-03-06 08:12:29
【问题描述】:

我现在正在创建一个定位客户端,目前我有

 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 类,我想在整个应用程序生命周期中运行,这个特定的应用程序运行许多活动,所以我不想在每次销毁和创建新活动时“重新创建”请求。

允许并检查 FINE_LOCATION 的权限,logcat 中没有错误,代码在创建 mFusedLocationClient 对象时运行 requestLocationUpdates 方法,但它从不调用“onLocationResult”方法。

使用这个 api 有什么我缺少的吗?

【问题讨论】:

    标签: android fusedlocationproviderclient


    【解决方案1】:

    在请求位置更新之前,您的应用必须连接到位置服务并发出位置请求。 像这样的东西:

    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);
    }
    

    【讨论】:

    • 嗨!我已添加到位置服务的连接并发出请求,我收到了来自“OnFailureListener”的回复,说明 - com.google.android.gms.common.api.ResolvableApiException: 6: RESOLUTION_REQUIRED 我还在寻找进入错误,我在方法调用之前检查了 FINE_LOCATION 并且我在清单中也有 INTERNET 权限,知道为什么我会得到这个响应吗? :)
    • 嗨!抱歉,我在工作时回复迟了,我发现调用 failureListener 的问题,我没有在我正在测试的设备上检查我的位置设置。我现在正在处理 client.requestLocationUpdates(request, new LocationCallback(){ @Override public void onLocationResult(LocationResult locationResult) { onLocationChanged(locationResult.getLastLocation()); } } , Looper.myLooper());
    • 但是 onLocationResult 从来没有被调用,我在权限检查中包含了这个 ACCESS FINE LOCATION 它正在通过但仍然没有响应
    • 发出位置请求并调用 requestLocationUpdates 后,您必须使用 client.getLastLocation() 从 google play 服务获取最后位置。响应可能为 null,如果为 null,则必须再次调用它,因为更新需要几秒钟。
    • 所以我换掉了设备,它工作了,在模拟器上运行它,它工作了,所以唯一的问题是实际的平板电脑本身,我不知道为什么,我用模拟器来模仿android 版本和 api 版本,所有相同的设置和版本都适用于移动设备和模拟器,只是由于某种未知原因无法在平板电脑上运行:/
    【解决方案2】:

    尝试从 android 设置中激活/停用位置。

    【讨论】:

      【解决方案3】:

      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),它只会返回一次坐标,可能会有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}")
          }
      

      接收坐标。

      【讨论】:

      • 当我使用setNumUpdates 时,我还看到我的onLocationResult 回调有时没有被击中。删除对setNumUpdates的调用后,我的回调总是被命中。
      • @AdamJohns,感谢您的体验。
      猜你喜欢
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 2018-12-10
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      相关资源
      最近更新 更多