Search code examples
google-mapsandroid-intentkml

How to Open KML file (from assets folder)


I have a KML file in assets folder. i want to open it into google earth or google map. but none of these worked. This is what I tried:

For Google Map

private GoogleMap map;
KmlLayer layer;
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_locations);


    try {
        layer = new KmlLayer(map,getAssets().open("locations.kml"),context);
        layer.addLayerToMap();
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

for Google earth

    File KML = null;
    try {
        KML = new File(String.valueOf(getAssets().open("locations.kml")));
    } catch (IOException e) {
        e.printStackTrace();
    }
    Intent i = 
getPackageManager().getLaunchIntentForPackage("com.google.earth");
    i.setDataAndType(Uri.fromFile(KML), "xml");
    startActivity(i);

Solution

    1. Create a new project with Google Map Activity.
    2. Now in the onMapReady() method use retrieveFileFromResource()

      private void retrieveFileFromResource() {
              try {
                  KmlLayer kmlLayer = new KmlLayer(mMap, R.raw.kml, getApplicationContext());
                  kmlLayer.addLayerToMap();
              } catch (IOException e) {
                  e.printStackTrace();
              } catch (XmlPullParserException e) {
                  e.printStackTrace();
              }
          }
      

      3.Full code

      public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
      
      private GoogleMap mMap;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_maps);
          // Obtain the SupportMapFragment and get notified when the map is ready to be used.
          SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                  .findFragmentById(R.id.map);
          mapFragment.getMapAsync(this);
      
      
      }
      
      @Override
      public void onMapReady(GoogleMap googleMap) {
          mMap = googleMap;
      
          retrieveFileFromResource();
      }
      
      private void retrieveFileFromResource() {
          try {
              KmlLayer kmlLayer = new KmlLayer(mMap, R.raw.kml, getApplicationContext());
              kmlLayer.addLayerToMap();
          } catch (IOException e) {
              e.printStackTrace();
          } catch (XmlPullParserException e) {
              e.printStackTrace();
          }
      }
      }