Long sory short, я разрабатываю приложение Android для сбора данных dinamyc и создания файла KML, чтобы показать характеристики вождения с самокалибровкой датчиков. Я хочу создать файл KML с помощью XMLserializer с полученными данными, это служба, которая управляет процессом создания файла (он может запускаться несколько раз, поэтому он не закрывает файл всегда):android: Xmlserializer не относится к отступу
File file = new File(sp.getString(getResources().getString(R.string.filesdir_key),"error"));
if (file.getPath().equals("error")) {
file = new File (Environment.getExternalStoragePublicDirectory("/smart-drive").toString()
+ "/SmaDri_" + sp.getString(getResources().getString(R.string.ruta_key),"00000000_0000"));
file.mkdirs();
}
finalFile = new File (file,"Final.kml");
if(!finalFile.exists()) {
try {
finalFile.createNewFile();
Log.d(TAG, "RefreshKML: creando " + finalFile.getPath());
} catch (IOException e) {
e.printStackTrace();
Log.d(TAG, "RefreshKML: fallo al crear " + finalFile.getName());
}
start = true;
}
try{
fileos = new FileOutputStream(finalFile,true);
} catch(FileNotFoundException e) {
e.printStackTrace();
Log.d(TAG,"RefreshKML: error abriendo "+finalFile.getName());
}
try {
serializer = Xml.newSerializer();
serializer.setOutput(fileos, "UTF-8");
if (start) {
kH.SerialStart(serializer, fileos, "Ruta "+sp.getString(getResources().getString(R.string.ruta_key),"00000000_0000"));
start = false;
}
int i=sp.getInt("poligonos",1);
for (s=0 ; s<PolyArray.size() ; s++){
polygon = PolyArray.get(s);
kH.SerialPlacePol(serializer, fileos,"Tramo "+i, polygon);
i++;
}
editor.putInt("poligonos",i);
editor.apply();
if (end) { //Solo cierra el archivo si se termina la recopilación de datos
kH.SerialEnd(serializer, fileos);
Log.d(TAG,"RefreshKML crea el cierre del KML");
end=false; //En caso de que no se completó esta opción
copyAllFiles();
mainDB.close();
DBHelper.close();
}
fileos.close();
} catch(IOException e) {
e.printStackTrace();
Log.d(TAG,"RefreshKML: error al escribir en serializer");
}
и это методы, которые я использую для создания заголовка, тела и закрытия файла KML:
public void SerialStart (XmlSerializer serializer, FileOutputStream fileos, String docName) {
try{
serializer.startDocument(null, Boolean.valueOf(true));
serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
serializer.startTag(null, "kml");
serializer.attribute(null, "xmlns", "http://www.opengis.net/kml/2.2");
serializer.attribute(null,"xmlns:gx", "http://www.google.com/kml/ext/2.2"); //ALE, para intentar que se vea en Earth
serializer.attribute(null, "xmlns:kml", "http://www.opengis.net/kml/2.2");
serializer.attribute(null, "xmlns:atom", "http://www.w3.org/2005/Atom");
serializer.startTag(null, "Document");
serializer.startTag(null, "name");
serializer.text(docName);
serializer.endTag(null, "name");
serializer.startTag(null, "open");
serializer.text("1");
serializer.endTag(null, "open");
} catch(Exception e){
Log.d(TAG,"KMLHelper: Exception occured in SerialStart");
e.printStackTrace();
}
}
public void SerialPlacePol (XmlSerializer serializer, FileOutputStream fileos, String placeName, PolyKML poly) {
try{
serializer.startTag(null, "Placemark");
// He añadido el tag fill porque parece que Google Earth la exige
serializer.startTag(null, "name");
serializer.text(placeName);
serializer.endTag(null, "name");
serializer.startTag(null, "description"); //PARA DESCRIPCION TIEMPOS
serializer.text(poly.gap); //PARA DESCRIPCION TIEMPOS
serializer.endTag(null, "description"); //PARA DESCRIPCION TIEMPOS
serializer.startTag(null, "Style");
serializer.startTag(null, "LineStyle");
serializer.startTag(null, "color");
serializer.text(poly.getLineColor());
serializer.endTag(null,"color");
serializer.startTag(null, "width");
serializer.text(poly.getLineWidth());
serializer.endTag(null,"width");
serializer.endTag(null,"LineStyle");
serializer.startTag(null, "PolyStyle");
serializer.startTag(null, "color");
serializer.text(poly.getPolyColor());
serializer.endTag(null,"color");
//ALE
serializer.startTag(null,"fill");
serializer.text("1");
serializer.endTag(null,"fill");
//ALE
serializer.endTag(null,"PolyStyle");
serializer.endTag(null,"Style");
serializer.startTag(null, "Polygon");
serializer.startTag(null, "tessellate");
if(poly.getTessellate()) serializer.text("1");
else serializer.text("0");
serializer.endTag(null,"tessellate");
serializer.startTag(null, "extrude");
if(poly.getExtrude()) serializer.text("1");
else serializer.text("0");
serializer.endTag(null,"extrude");
serializer.startTag(null, "altitudeMode");
serializer.text(poly.getAltitudeMode().toString());
serializer.endTag(null,"altitudeMode");
serializer.startTag(null, "outerBoundaryIs");
serializer.startTag(null, "LinearRing");
serializer.startTag(null, "coordinates");
serializer.text(poly.getCoorString());
serializer.endTag(null, "coordinates");
serializer.endTag(null, "LinearRing");
serializer.endTag(null, "outerBoundaryIs");
serializer.endTag(null, "Polygon");
serializer.endTag(null,"Placemark");
serializer.flush(); //ALE
}catch(Exception e){
Log.d(TAG,"KMLHelper: Exception occured in SerialPlacePol");
e.printStackTrace();
}
}
public void SerialEnd (XmlSerializer serializer, FileOutputStream fileos) {
try{
serializer.endTag(null,"Document");
serializer.endTag(null,"kml");
//serializer.endDocument();
serializer.flush();
fileos.close();
Log.d(TAG,"KMLHelper: SerialEnd cierra archivo KML");
}catch(Exception e){
Log.d(TAG,"KMLHelper: Exception occured in SerialEnd");
e.printStackTrace();
}
}
и результат хорошо, но отступы, она теряется через какое-то время, это всегда бывает. Пример результирующего файла с разницей в отступе состоит в следующем, есть одна пометки с соответствующим отступом, но вдруг следующий не имеют отступов всего:
<Placemark>
<name>Tramo 1</name>
<description>1484689867000 - 1484689868000</description>
<Style>
<LineStyle>
<color>55FFFFFF</color>
<width>1</width>
</LineStyle>
<PolyStyle>
<color>4114B464</color>
<fill>1</fill>
</PolyStyle>
</Style>
<Polygon>
<tessellate>1</tessellate>
<extrude>1</extrude>
<altitudeMode>relativeToGround</altitudeMode>
<outerBoundaryIs>
<LinearRing>
<coordinates>-4.46107189168431,36.7189079696287,1.0 -4.461074321984691,36.71889869818065,1.0 -4.46104946831569,36.718892230371296,1.0 -4.461047018015309,36.71890140181935,1.0 -4.46107189168431,36.7189079696287,1.0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark><Placemark><name>Tramo 1</name><description>-15 - -15</description><Style><LineStyle><color>55464646</color><width>1</width></LineStyle><PolyStyle><color>55FFFFFF</color><fill>1</fill></PolyStyle></Style><Polygon><tessellate>1</tessellate><extrude>1</extrude><altitudeMode>relativeToGround</altitudeMode><outerBoundaryIs><LinearRing><coordinates>-4.461042046219597,36.718907918437075,1.0 -4.461048518308548,36.71890698667229,1.0 -4.461047061691453,36.71889709332772,1.0 -4.461040613780402,36.71889802156293,1.0 -4.461042046219597,36.718907918437075,1.0</coordinates></LinearRing></outerBoundaryIs></Polygon></Placemark><Placemark><name>Tramo 1</name><description>-15 - -15</description><Style><LineStyle><color>55464646</color><width>1</width></LineStyle><PolyStyle><color>55FFFFFF</color><fill>1</fill></PolyStyle></Style><Polygon><tessellate>1</tessellate><extrude>1</extrude><altitudeMode>relativeToGround</altitudeMode><outerBoundaryIs><LinearRing><coordinates>-4.461038813540282,36.718908388824126,1.0 -4.461042046219597,36.718907918437075,1.0 -4.461040613780402,36.71889802156293,1.0 -4.461037386459718,36.71889849117587,1.0 -4.461038813540282,36.718908388824126,1.0</coordinates></LinearRing></outerBoundaryIs></Polygon></Placemark>
Может кто-нибудь сказать мне, в чем проблема, которая приводит к потере отступов? Я буду признателен за любые идеи, которые могли бы мне помочь в решении этой проблемы.