Firestore如何使用Geopoint

时间:2017-10-20 15:04:36

标签: android firebase google-cloud-firestore

实现可序列化的对象非常有用,因为它可以传递一个intent的附加内容:

Intent intent = new Intent(this, SomeActivity.class);
intent.putExtra("key", someObject);
startActivity(intent);

然后在其他活动中获取它:

MyObjectUsinGeoPoint Object = (MyObjectUsinGeoPoint) getIntent().getSerializableExtra("key");

问题是,我收到了这个错误:

Caused by: java.io.NotSerializableException: com.google.firebase.firestore.GeoPoint

我尝试通过在模型中创建内部类来使GeoPoint实现Serializable

private class GeoBetter extends GeoPoint implements Serializable {

    public GeoBetter(double v, double v1) {
        super(v, v1);
    }
}

然后在构造函数中初始化它:

public MyObjectUsinGeoPoint(double latitude, double longitude) {
    geoPoint = new GeoBetter(latitude, longitude);
}

但我得到了另一个错误:

Caused by: java.io.InvalidClassException: com.domain.tupas.models.MyObjectUsinGeoPoint$GeoBetter; no valid constructor

如何为包含不可序列化的Object的Intent添加额外内容?

2 个答案:

答案 0 :(得分:3)

你可以尝试下面的方法:

private GeoPoint location;

@Override
public void writeToParcel(Parcel parcel, int i)
{
    parcel.writeDouble(location.getLatitude());
    parcel.writeDouble(location.getLongitude());
}

public UserModel(Parcel in)
{
    Double lat = in.readDouble();
    Double lng = in.readDouble();
    location = new GeoPoint(lat, lng);
}

如果类不太复杂(如GeoPoint),它可以工作,否则你需要找到不同的方法。

答案 1 :(得分:0)

您可以通过将android.location.Location对象发送为Parcelable来实现相同目标,因为位置对象已实现Parcelable接口

然后在另一个活动中,您可以从intent获取位置对象并构造一个新的com.google.firebase.firestore.GeoPoint对象并将其设置为您自己的模型 像这个简单的例子: -

1-首先获取位置对象并将其作为Parcelable extra传递给intent

@Override
public void onLocationChanged(Location location) {

    Intent intent = new Intent(context,AnotherActivity.class);
    intent.putExtra("extraLocation",location);
    context.startActivity(intent);
}

或者您可以创建位置对象并手动为其提供纬度和经度

Location location = new Location(LocationManager.GPS_PROVIDER); // any provider 
location.reset();
location.setLatitude(latitude);
location.setLongitude(longitude);

2-在另一个活动中从Intent extra

获取位置对象
Location location = getIntent().getParcelableExtra("extraLocation");
GeoPoint geoPoint = geoPointFromLocation(location);

3-这是将位置对象转换为GeoPoint的简单方法

 private GeoPoint geoPointFromLocation(Location location) {

        GeoPoint geoPoint = new GeoPoint(location.getLatitude(),location.getLongitude());
        return geoPoint ;
    }

最后,您可以在模型中设置GeoPoint对象。