我想实现一个记录器,它在一定时间后或位置发生变化时存储客户端的位置。当我启动记录器时,它只为该位置提供一次服务。当我改变客户的位置时,没有任何反应。 授予权限 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 的几个参数,没有任何更改
希望大家有帮助的提示