使用 GeoFire 将用户纬度和经度存储到我的数据库中 - 它没有持续更新

Posted

技术标签:

【中文标题】使用 GeoFire 将用户纬度和经度存储到我的数据库中 - 它没有持续更新【英文标题】:Using GeoFire to store user latitude and longitude into my database - It's not updating consistently 【发布时间】:2019-01-27 03:49:33 【问题描述】:

我正在创建一个应用程序,该应用程序使用他们的 UID 定期存储和更新每个用户的纬度和经度。目前,当用户第一次注册时,他们的纬度/经度被成功捕获并使用 Geofire 上传到我的 Firebase 数据库,到一个名为“Geo”的表中。但是,我也尝试在应用程序主活动上实现类似的代码,以便用户纬度/经度不断更新。

我当前的主要活动代码没有标记任何错误,但是用户经纬度在初始注册后没有更新。有谁知道为什么会这样?

主要活动(尽可能多地删除不相关的代码):

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



像往常一样,非常感谢任何帮助。

Android Studio v3.1.3

【问题讨论】:

【参考方案1】:

首先LocationServices.FusedLocationApi.requestLocationUpdates已被弃用,尝试使用mFusedLocationClient.requestLocationUpdates(getLocationRequest(), mLocationCallback, null);(来自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。

【讨论】:

谢谢,我考虑了您的所有建议。还没有运气,但我会继续努力! 现在有什么问题?你没有得到位置更新?还是没有保存到geofire? 我需要在我的 onLocationChanged 方法中添加一个 if (currentUser != null) 语句来阻止应用程序崩溃。现在一切正常。

以上是关于使用 GeoFire 将用户纬度和经度存储到我的数据库中 - 它没有持续更新的主要内容,如果未能解决你的问题,请参考以下文章

特定点附近的所有纬度经度(纬度经度)

Swift:获取用户的位置坐标为纬度和经度?

Android geofire获取一定半径内的用户列表

将经度和纬度存储到数据库的问题

无法将我的纬度或经度附加到 html 文档?

如果没有创建Geofire,我如何检查Geofire是否将用户注销?