KMZ is just zipped KML format, so just format KML-formatted String
with your markers data like:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>Document.kml</name>
<open>1</open>
<Style id="exampleStyleDocument">
<LabelStyle>
<color>ff0000cc</color>
</LabelStyle>
</Style>
<Placemark>
<name>Document Feature 1</name>
<styleUrl>#exampleStyleDocument</styleUrl>
<Point>
<coordinates>-122.371,37.816,0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Document Feature 2</name>
<styleUrl>#exampleStyleDocument</styleUrl>
<Point>
<coordinates>-122.370,37.817,0</coordinates>
</Point>
</Placemark>
</Document>
</kml>
then zip it (for example like in this answer of scessor) an save to .kmz
file.
UPDATE: Here is source code, which generates markers.kmz
file in KMZ
folder of External Storage:
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
public static final int REQUEST_PERMISSIONS_CODE = 1111;
static final LatLng MAIDAN = new LatLng(50.450311, 30.523730);
static final LatLng SOPHIA = new LatLng(50.452973, 30.514502);
static final LatLng LAVRA = new LatLng(50.434692, 30.556931);
private GoogleMap mGoogleMap;
private MapFragment mMapFragment;
private List<Marker> mMarkers = new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (!checkPermission()) {
requestPermission();
}
mMapFragment = (MapFragment) getFragmentManager()
.findFragmentById(R.id.map_fragment);
mMapFragment.getMapAsync(this);
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_PERMISSIONS_CODE:
if (grantResults.length > 0) {
boolean storagePermission = grantResults[0] == PackageManager.PERMISSION_GRANTED;
if (storagePermission) {
exportMarkersToKMZfile(mMarkers);
Toast.makeText(MainActivity.this, "Permission Granted",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this,"Permission Denied",Toast.LENGTH_LONG).show();
}
}
break;
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
mMarkers.add(mGoogleMap.addMarker(new MarkerOptions().position(MAIDAN).title("Maidan")));
mMarkers.add(mGoogleMap.addMarker(new MarkerOptions().position(SOPHIA).title("Sophia")));
mMarkers.add(mGoogleMap.addMarker(new MarkerOptions().position(LAVRA).title("Lavra")));
mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(MAIDAN, 16));
exportMarkersToKMZfile(mMarkers);
}
public static String exportMarkersToKML(List<Marker> markers) {
StringBuilder kmlStringBuilder = new StringBuilder(500 * (markers.size() + 3));
// add KML header
kmlStringBuilder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
kmlStringBuilder.append("<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n");
kmlStringBuilder.append("<Document>\n");
kmlStringBuilder.append("<name>Document.kml</name>\n");
// add style for marker
kmlStringBuilder.append("<Style id=\"blueMarker\">\n");
kmlStringBuilder.append("<LabelStyle>\n");
kmlStringBuilder.append("<color>ff00ff00</color>\n");
kmlStringBuilder.append("</LabelStyle>\n");
kmlStringBuilder.append("</Style>\n");
// add markers as KML placemarks
for (Marker marker : markers) {
kmlStringBuilder.append("<Placemark>\n");
kmlStringBuilder.append(String.format("<name>%s</name>\n", marker.getTitle()));
kmlStringBuilder.append("<styleUrl>#blueMarker</styleUrl>\n");
kmlStringBuilder.append("<Point>\n");
kmlStringBuilder.append(String.format("<coordinates>%8.3f,%8.3f,0</coordinates>\n",
marker.getPosition().longitude, marker.getPosition().latitude));
kmlStringBuilder.append("</Point>\n");
kmlStringBuilder.append("</Placemark>\n");
}
kmlStringBuilder.append("</Document>\n");
kmlStringBuilder.append("</kml>\n");
return kmlStringBuilder.toString();
}
public static void exportMarkersToKMZfile(List<Marker> markers) {
try {
String kmlString = exportMarkersToKML(markers);
File kmzFolder = new File(Environment.getExternalStorageDirectory(), "KMZ");
if (!kmzFolder.exists()) {
kmzFolder.mkdir();
}
File kmzFile = new File(kmzFolder, "markers.kmz");
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(kmzFile));
ZipEntry entry = new ZipEntry("markers.kml");
zipOutputStream.putNextEntry(entry);
zipOutputStream.write(kmlString.getBytes());
zipOutputStream.flush();
zipOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public boolean checkPermission() {
return ContextCompat.checkSelfPermission(getApplicationContext(), WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED;
}
private void requestPermission() {
ActivityCompat.requestPermissions(MainActivity.this, new
String[]{WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS_CODE);
}
}
And don't forget add
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
to your AndroidManifest.xml
file.