Android LocationServices 只响应一次

问题描述 投票:0回答:0

我想实现一个记录器,它在一定时间后或位置发生变化时存储客户端的位置。当我启动记录器时,它只为该位置提供一次服务。当我改变客户的位置时,没有任何反应。 授予权限 ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION、WRITE_EXTERNAL_STORAGE,我正在使用安装了 Play 商店的模拟器。

这是我的代码:

import android.annotation.SuppressLint;
import android.location.Location;
import android.os.Looper;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentActivity;

import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.Granularity;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.Priority;
import com.google.android.gms.tasks.OnCanceledListener;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;

import de.remi.locker.database.entities.Trip;
import de.remi.locker.util.MapsHelper;
import de.remi.locker.util.PermissionHelper;

public class AndroidLogger implements AutoLogger.ILoggerClient {
    private static final String TAG = "AndroidLogger";
    private final FragmentActivity activity;
    private FusedLocationProviderClient client;
    private LocationCallback callBack;

    public AndroidLogger(FragmentActivity activity) {
        this.activity = activity;
        init();
    }

    private void init() {
        client = LocationServices.getFusedLocationProviderClient(activity);
        callBack = new LocationCallback() {
            @Override
            public void onLocationResult(@NonNull LocationResult locationResult) {
                locationResult.getLocations().forEach(location -> handleLocation(location));
            }
        };
    }

    private void handleLocation(Location location) {
        Log.d(TAG, "handleLocation: " + location);
    }

    private LocationRequest getLocationRequest() {
        LocationRequest.Builder builder = new LocationRequest.Builder(10000);
        builder.setMinUpdateDistanceMeters(50);
        builder.setDurationMillis(60 * 1000);
        builder.setGranularity(Granularity.GRANULARITY_FINE);
        builder.setWaitForAccurateLocation(false);
        builder.setPriority(Priority.PRIORITY_HIGH_ACCURACY);
        return builder.build();
    }

    @SuppressLint("MissingPermission")
    @Override
    public void startLogging(Trip trip) {
        if (!PermissionHelper.hasPermissions(activity.getApplicationContext(), MapsHelper.OSM_PERMISSIONS))
            throw new UnsupportedOperationException("permissions missing ");

        client.requestLocationUpdates(getLocationRequest(), callBack, Looper.myLooper()).addOnCanceledListener(new OnCanceledListener() {
            @Override
            public void onCanceled() {
                Log.d(TAG, "onCanceled: ");
            }
        }).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                Log.d(TAG, "onComplete: ");
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.e(TAG, "onFailure: ", e);
            }
        }).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void unused) {
                Log.d(TAG, "onSuccess: ");
            }
        });
    }

    @Override
    public void stopLogging() {
        client.removeLocationUpdates(callBack);
    }


据我所知,每 60 秒或位置变化至少 50 米后,应执行新的位置日志。 我使用了几个模拟器,从 API 30 - 33,将 CallBack 更改为侦听器,没有任何改变。我还更改了 LocationRequest 的几个参数,没有任何更改

希望大家有帮助的提示

java android location google-location-services fusedlocationproviderclient
© www.soinside.com 2019 - 2024. All rights reserved.