android - 使用 GeoFire 将用户纬度和经度存储到我的数据库中 - 它没有持续更新
问题描述
我正在创建一个应用程序,该应用程序使用他们的 UID 定期存储和更新每个用户的纬度和经度。目前,当用户第一次注册时,他们的纬度/经度被成功捕获并使用 Geofire 上传到我的 Firebase 数据库,到一个名为“Geo”的表中。但是,我也尝试在应用程序主活动上实现类似的代码,以便用户 lat/long 不断更新。
我当前的主要活动代码没有标记任何错误,但是用户经纬度在初始注册后没有更新。有谁知道为什么会这样?
主要活动(尽可能多地删除不相关的代码):
public class FindChatters extends Fragment implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener {
GoogleApiClient mGoogleAPIClient;
Location mLastLocation;
LocationRequest mLocationRequest;
public FindChatters() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
mMainView = inflater.inflate(R.layout.fragment_find_chatters, container, false);
mUsersDatabase = FirebaseDatabase.getInstance().getReference().child("Users");
mCurrentUser = FirebaseAuth.getInstance().getCurrentUser();
...
return mMainView;
}
//RETRIEVE DATA IN REALTIME
@Override
public void onStart() {
super.onStart();
startListening();
}
public void startListening() {
...
//
//BUILD API CLIENT TO GET LOCATION UPDATES
protected synchronized void buildGoogleAPIClient() {
mGoogleAPIClient = new GoogleApiClient.Builder(getActivity()).addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).addApi(LocationServices.API)
.build();
mGoogleAPIClient.connect();
}
//UPDATE USERS LOCATION OVER A SPECIFIED PERIOD
@Override
public void onConnected(@Nullable Bundle bundle) {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(1000);
mLocationRequest.setFastestInterval(1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
if (ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && A ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleAPIClient, mLocationRequest, this);
buildGoogleAPIClient();
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
//SAVE USERS UPDATED LOCATION TO THE DATABASE
@Override
public void onLocationChanged(Location location) {
mLastLocation = location;
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
String userID = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Geo");
//ADD THE UPDATED USER LAT/LNG TO THE DATABASE
GeoFire geoFire = new GeoFire(ref);
geoFire.setLocation(userID, new GeoLocation(location.getLatitude(), location.getLongitude()));
}
}
像往常一样,非常感谢任何帮助。
安卓工作室 v3.1.3
解决方案
首先LocationServices.FusedLocationApi.requestLocationUpdates
不推荐使用,尝试使用mFusedLocationClient.requestLocationUpdates(getLocationRequest(), mLocationCallback, null);
(callback from com.google.android.gms.location.LocationCallback
)。
其次,您想在应用程序运行时更新位置?如果您需要一直进行更新,请查看 FirebaseJobDispatcher,它会为您提供开始更新并每 n 分钟保存一次(最少每 20 分钟)的选项,
同样来自文档:这个间隔是不准确的。您可能根本不会收到更新(如果没有可用的位置源),或者您收到更新的速度可能比请求的慢。您也可能比请求更快地收到它们(如果其他应用程序以更快的间隔请求位置)。可以使用 setFastestInterval(long) 控制您接收更新的最快速度。默认情况下,此最快速率是间隔频率的 6 倍。 https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest
最后一件事,Geofire setLocation 有回调,你可以在那里制作日志:
GeoFire geoFire = new GeoFire(ref);
geoFire.setLocation(userID, new GeoLocation(lat, lng), new GeoFire.CompletionListener() {
@Override
public void onComplete(String key, DatabaseError error) {
Log.d(TAG, "onComplete: " );
}
});
PS:如果您的 locationResult != null,则将在 LocationCallback 中检查良好的做法,如果位置服务未在设备上运行,它将为 null。
推荐阅读
- reactjs - 将 Redux 选择器值传递给响应状态而不在 useEffect 中重新渲染
- c++ - 为什么 C++20 std::condition_variable 不支持 std::stop_token?
- c++ - 如何在 C++ 控制台中禁用输入法?
- typescript - 将 ECMAScript Observable / Zen Observable 转换为 RXJS Observable
- flutter - Dart:getter 被调用为 null。空检查后立即
- python - 无法使用bloomberg blpapi Python保持稳定的会话打开
- azure - 如何从 Azure 数据工厂将我的 json 路径映射到 cosmos db
- android - 未触发协程流的 Android 回调
- python - 多输入 GAN 返回错误 ValueError: Graph disconnected:
- discord - 无法读取未定义的“发送”属性