如何在共享首选项中保存纬度和经度(位置)

时间:2014-09-14 18:02:31

标签: android arrays sharedpreferences

我想获取位置的经度和纬度坐标并保存在ArrayList中,然后将此列表提交到SharedPreference文件,这样当Map加载所有以前的位置时,可以使用来自SharedPreference文件的数据使用标记设置

我只知道SharedPreference只会存储原始数据类型而不存储数组。

我的问题是,是否有人知道通过共享pref技术或任何其他方式保留此数据的方法?

任何意见都赞赏。

3 个答案:

答案 0 :(得分:3)

您可以将它们存储为以句点/逗号分隔的字符串。但是在纬度和经度的情况下,你不应该使用句号,因为它们有句号(纬度= 27 345)

例如

String aLocation = latitude + "," + longitude//store this to sharedpreference

这不会成为经度和纬度的问题,因为没有逗号(但有句号)可能与你的限制器发生冲突。

在检索位置时,您可以拆分它并获得相应的经度和纬度。

String[] locationArray = pref.getString(KEY_LOCATION, "").split(","); 
String retrievedLat = locationArray[0];
String retrievedLong = locationArray[1];//you may need to use trim() method

您也可以将其转换为 JSON 并保存。但我更喜欢上述方法,因为它更容易,并且不会给您的方案带来任何问题。

但是如果您需要使用特殊字符(如句号)存储字符串,则需要将其设为JSON,因为它可能与您的限制器冲突

所以你可以这样做:

public void addToPref(LatLng location){//I'm supposing you are using LatLang class
    String aLocation = location.getLatitude() + "," + location.getLongitude();
//and save to shared preference
    }

<强>更新

如果要输入多个位置,则需要使用JSON(首选),但第一种方法更容易。 见下文

1. Get string from preference
2. Concatenate it with the new location

像:

oldLocation,newLocation,newerLocation

P.S。您可能拥有每个位置的经度和纬度,因此字符串必须类似于

{lat1,long1}:{lat2,lat2}:{lat3,long3}

在这种情况下,你需要有多个限制器并做(相应地拆分)。

使用拆分(&#34;:&#34;)方法会为您提供多个位置。

然后使用拆分(&#34;,&#34;)进一步拆分,它将为您提供相应的纬度和经度。

答案 1 :(得分:3)

1-创建一个类并放置您要存储的所有内容,例如arraylistlatitude的{​​{1}},并使该类实现longitude接口。

Serializable

2-将其写入文件:

class MyBundle  implements Serializable {

   ArrayList<Double> mLat;
   ArrayList<Double> mLan;

   MyBundle( ArrayList<Double> latitude, ArrayList<Double> longitude ){

    mLat = latitude;
    mLan = longitude;

   }

}

并取回所有内容:

 ObjectOutputStream oos = null;
 FileOutputStream fout = null;
 try{
        FileOutputStream fout = new FileOutputStream("Your file path");
        ObjectOutputStream oos = new ObjectOutputStream(fout);
        oos.writeObject(mb); // mb is an instance of MyBundle
 } catch (Exception ex) {
        e.printStackTrace();
 }finally {
   if(oos  != null){
     oos.close();
   } 
 }

答案 2 :(得分:1)

我使用简单函数

使用这些方法
// Saving GeoFence marker with prefs mng
    private void saveGeofence() {
        Log.d(TAG, "saveGeofence()");
        SharedPreferences sharedPref = getPreferences( Context.MODE_PRIVATE );
        SharedPreferences.Editor editor = sharedPref.edit();

        editor.putLong( KEY_GEOFENCE_LAT, Double.doubleToRawLongBits( geoFenceMarker.getPosition().latitude ));
        editor.putLong( KEY_GEOFENCE_LON, Double.doubleToRawLongBits( geoFenceMarker.getPosition().longitude ));
        editor.apply();
    }

    // Recovering last Geofence marker
    private void recoverGeofenceMarker() {
        Log.d(TAG, "recoverGeofenceMarker");
        SharedPreferences sharedPref = getPreferences( Context.MODE_PRIVATE );

        if ( sharedPref.contains( KEY_GEOFENCE_LAT ) && sharedPref.contains( KEY_GEOFENCE_LON )) {
            double lat = Double.longBitsToDouble( sharedPref.getLong( KEY_GEOFENCE_LAT, -1 ));
            double lon = Double.longBitsToDouble( sharedPref.getLong( KEY_GEOFENCE_LON, -1 ));
            LatLng latLng = new LatLng( lat, lon );
            markerForGeofence(latLng);
            drawGeofence();
        }
    }