代码之家  ›  专栏  ›  技术社区  ›  Mattia

融合位置问题-地理定位不起作用

  •  0
  • Mattia  · 技术社区  · 7 年前

    我必须实现一个功能,使用所有可用传感器之一(例如wifi、gps、数据ecc)返回用户的当前地理位置。

    我查找了有关它的信息,找到了几个解决方案,目前我感兴趣的是“融合位置”的使用,但我没有找到使用指南或完整的示例。

    这是我当前使用的代码:

    public class LocationService extends Service {
    
    private FusedLocationProviderClient mFusedLocationClient;
    private SettingsClient mSettingsClient;
    private LocationRequest mLocationRequest;
    private LocationSettingsRequest mLocationSettingsRequest;
    private LocationCallback mLocationCallback;
    private Location mCurrentLocation;
    private Boolean mRequestingLocationUpdates;
    private WriteInLogFile wil = new WriteInLogFile();
    
    @Override
    public void onCreate() {
        try {
            DbGest db = DbGest.getInstance(getApplicationContext());
            String deviceType = db.getSetting("deviceType");
    
            long updateInterval;
            if (deviceType.compareToIgnoreCase("smartphone") == 0) {
                updateInterval = Long.parseLong(db.getSetting("pollGPSPhone"));
            } else {
                updateInterval = Long.parseLong(db.getSetting("pollGPSTablet"));
            }
    
            long updateInMillisecond = updateInterval / 2;
    
            mLocationRequest = new LocationRequest();
            mLocationRequest.setInterval(updateInterval);
            mLocationRequest.setFastestInterval(updateInMillisecond);
            mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    
    
            mRequestingLocationUpdates = false;
            mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
            mSettingsClient = LocationServices.getSettingsClient(this);
    
            mLocationCallback = new LocationCallback() {
                @Override
                public void onLocationResult(LocationResult locationResult) {
                    super.onLocationResult(locationResult);
                    mCurrentLocation = locationResult.getLastLocation();
                    updateLocation();
                }
            };
    
    
            LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
            builder.addLocationRequest(mLocationRequest);
            builder.setNeedBle(true);
            mLocationSettingsRequest = builder.build();
            startLocationUpdates();
        } catch (Exception e) {
            wil.WriteFile("1)LocationService - Exception: " + e.toString());
        }
    }
    
    
    public void startLocationUpdates() {
        if (!mRequestingLocationUpdates) {
            mRequestingLocationUpdates = true;
            mSettingsClient.checkLocationSettings(mLocationSettingsRequest).addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
                @Override
                public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
                    if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                        mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    wil.WriteFile("2)LocationService - Exception: " + e.toString());
                }
            });
        }
    }
    
    
    private void stopLocationUpdates() {
        if (!mRequestingLocationUpdates) {
            return;
        }
        mFusedLocationClient.removeLocationUpdates(mLocationCallback).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                mRequestingLocationUpdates = false;
            }
        });
    }
    
    
    private void updateLocation() {
        if (mCurrentLocation != null) {   
        DbGest.getInstance(getApplicationContext()).insertIntoLastPositionKnown(mCurrentLocation, getApplicationContext());
        }
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        stopLocationUpdates();
    }
    
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    } }
    

    如果我通过Wi-Fi连接到网络,则代码可以正常工作。在这种情况下,所有代码都可以正常工作,但当我切换到3g时,会出现错误:

    通用域名格式。谷歌。安卓gms。常见的应用程序编程接口。ResolvableApiException:6: 需要分辨率\u

    在gradle:

    compile 'com.google.android.gms:play-services-gcm:11.6.2'
    compile 'com.google.android.gms:play-services-vision:11.6.2'
    compile 'com.google.android.gms:play-services-location:11.6.2'
    compile 'com.google.android.gms:play-services-maps:11.6.2'
    

    我不知道如何解决这个问题。。。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Racer    7 年前

    获取位置可能需要一些时间,我建议在后台处理它会让体验更加顺畅。检查您是否已获得权限,并且您的应用程序中是否已启用该权限。如果需要进一步帮助,请张贴日志。我已经尝试过这个代码,效果很好!

        private void getUserLocation() {
        FusedLocationProviderClient mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            mFusedLocationClient.getLastLocation()
                    .addOnSuccessListener(new OnSuccessListener<Location>() {
                        @Override
                        public void onSuccess(Location location) {
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    });
        }
    }
    
        2
  •  0
  •   Володимир    4 年前

    发现相同错误的任何人: 它在您呼叫时出现

     new LocationSettingsRequest.Builder().addLocationRequest(mLocationRequest);
    

     LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
        builder.addLocationRequest(mLocationRequest);
    

    我的解决方案——不要打电话。addLocationRequest(…) 这个错误发生在我同时调用的时候 builder.addLocationRequest task = client.checkLocationSettings(builder.build()) 添加请求。 看见 https://developer.android.com/training/location/change-location-settings#get-settings