Android — клиент Fused Location Provider иногда получает неправильное местоположение

Я хочу получать местоположение GPS пользователя раз в минуту. Я использую класс обслуживания ниже. Но иногда это становится неправильным местоположением. Я не отключал GPS или данные. Я использую Samsung Mobile (J7 Max).

Например, на прикрепленном изображении (Изображение местоположения GPS) я находился в точке B. Но GPS дал местоположение A.

Как я могу устранить эту ошибку и получить точное местоположение?

Изображение местоположений GPS

LocationService.java

public class LocationService extends Service {
    private FusedLocationProviderClient mFusedLocationProviderClient;
    private SettingsClient mSettingsClient;
    private LocationCallback mLocationCallback;
    private LocationRequest mLocationRequest;
    private LocationSettingsRequest mLocationSettingsRequest;

    private long UPDATE_INTERVAL_IN_MILLISECONDS;
    private long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS;

    @Override
    public void onCreate() {
        super.onCreate();

        mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
        mSettingsClient = LocationServices.getSettingsClient(this);

        UPDATE_INTERVAL_IN_MILLISECONDS = 1 * 60 * 1000;
        FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = UPDATE_INTERVAL_IN_MILLISECONDS / 2;

        createLocationCallback();
        createLocationRequest();
        buildLocationSettingsRequest();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        startLocationUpdates();
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        stopLocationUpdates();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private void createLocationCallback() {
        mLocationCallback = new LocationCallback() {
            @SuppressLint("MissingPermission")
            @Override
            public void onLocationResult(LocationResult locationResult) {
                super.onLocationResult(locationResult);

                try {
                    Location location = locationResult.getLastLocation();

                    //.... my code ....//

                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        };
    }

    @SuppressLint("RestrictedApi")
    private void createLocationRequest() {
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }

    private void buildLocationSettingsRequest() {
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
        builder.addLocationRequest(mLocationRequest);
        mLocationSettingsRequest = builder.build();
    }

    private void startLocationUpdates() {
        mSettingsClient.checkLocationSettings(mLocationSettingsRequest)
                .addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
                    @SuppressLint("MissingPermission")
                    @Override
                    public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
                        mFusedLocationProviderClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
                    }
                });
    }

    private void stopLocationUpdates() {
        mFusedLocationProviderClient.removeLocationUpdates(mLocationCallback)
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                    }
                });
    }

}

Манифест

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<uses-feature android:name="android.hardware.location.gps" />

build.gradle (проект)

buildscript {

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.3'
        classpath 'com.google.gms:google-services:3.1.1'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

build.gradle (модуль)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "xxx.xxx.xxxxxxx"
        minSdkVersion 18
        targetSdkVersion 26
        versionCode 100
        versionName "1.0.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:design:26.1.0'
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.google.android.gms:play-services-location:12.0.1'
    implementation 'com.google.android.gms:play-services-maps:12.0.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

apply plugin: 'com.google.gms.google-services'

person Ajantha Wijerathna    schedule 11.09.2018    source источник


Ответы (1)


Я думаю, что причина этого не в вашем приложении, а в том, что ошибка была сделана телефоном. Чтобы убедиться в этом, вы можете протестировать свое приложение на другом телефоне.

person No Body    schedule 11.09.2018
comment
Спасибо за ответ. Я проверил с некоторыми другими телефонами Samsung (J2). Иногда эти телефоны также получают неправильное местоположение. - person Ajantha Wijerathna; 11.09.2018
comment
Вы тестировали приложение в разных местах? - person No Body; 11.09.2018
comment
Да. Разные локации, разные дороги. Есть ли ошибка/ошибка в реализации моего кода? - person Ajantha Wijerathna; 11.09.2018
comment
Я этого не сделал. Это всегда происходит? - person No Body; 11.09.2018
comment
Только иногда. - person Ajantha Wijerathna; 12.09.2018
comment
Так что я думаю, это не связано с вашим приложением. - person No Body; 12.09.2018