【问题标题】:Fused Location Issue - Geo localization not work融合位置问题 - 地理定位不起作用
【发布时间】:2017-12-15 11:29:06
【问题描述】:

我必须实现一个函数,该函数使用所有可用传感器之一(例如 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 时,会出现错误:

com.google.android.gms.common.api.ResolvableApiException: 6: RESOLUTION_REQUIRED

在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'

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

【问题讨论】:

    标签: android geolocation position


    【解决方案1】:

    获取位置可能需要一些时间,我建议在后台处理它会使体验更顺畅。检查您是否获得了权限,并且您的应用中已启用该权限。如果您需要进一步的帮助,请发布日志。我已经尝试过这段代码并且工作正常!

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

    【讨论】:

    • 我已经发布了我的日志内容:com.google.android.gms.common.api.ResolvableApiException: 6: RESOLUTION_REQUIRED。授予所有权限。代码在后台运行的服务中实现
    • 你的代码工作,我不明白你和我的代码之间的区别,你能解释一下为什么在这种情况下工作吗?
    • 听不懂!它起作用了吗? //上面的代码使用了一个 Fused 位置,它是 Play 服务的一部分。融合位置是您获得由谷歌地图或类似服务存储的设备的最后一个已知位置的位置。但是您仍然可以获取经纬度的位置权限(权限: )
    【解决方案2】:

    遇到相同错误的任何人: 当你打电话时它会出现

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

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

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

    【讨论】:

    • 如果用户不允许使用位置也可能出现
    猜你喜欢
    • 2015-12-22
    • 1970-01-01
    • 2012-02-24
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2015-01-31
    相关资源
    最近更新 更多