Как я могу отправить файл kml в Google Планета Земля, как это делают MyTracks (с открытым исходным кодом)?

Я не знаю, видели ли вы удивительное обновление Mytrack, но оно позволяет отправлять файл kml в приложение Google Earth и отображать его в приложении Google (если оно установлено, конечно).

введите здесь описание изображения

Исходный код находится здесь: http://code.google.com/p/mytracks/source/browse/

но я не могу найти способ добиться такого.

Кажется, я нашел кое-что здесь: http://code.google.com/r/jshih-mytracks3/source/browse/MyTracks/src/com/google/android/apps/mytracks/io/file/SaveActivity.java?spec=svn5178eb75934b7f0c4c23ec26b7d79a0787de18b8&r=5178eb75934b7f0c4c23ec26b7d79a0787de18b8

else if (playTrack) {
        Intent intent = new Intent()
            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK)
            .putExtra(GOOGLE_EARTH_TOUR_FEATURE_ID, KmlTrackWriter.TOUR_FEATURE_ID)
            .setClassName(GOOGLE_EARTH_PACKAGE, GOOGLE_EARTH_CLASS)
            .setDataAndType(Uri.fromFile(new File(savedPath)), GOOGLE_EARTH_KML_MIME_TYPE);
        startActivity(intent);

Жестко запрограммированный способ дает этот код:

    Intent intent = new Intent()
            .addFlags(
                    Intent.FLAG_ACTIVITY_CLEAR_TOP
                            | Intent.FLAG_ACTIVITY_NEW_TASK)
            .putExtra("com.google.earth.EXTRA.tour_feature_id","tour")
            .setClassName("com.google.earth", "com.google.earth.EarthActivity")
            .setDataAndType(Uri.fromFile(new File("/sdcard/test.kml")),
                    "application/vnd.google-earth.kml+xml");
    startActivity(intent);

Но приведенный выше код просто отображает путь с тем же результатом, что и этот код:

 Intent mapIntent = new Intent(Intent.ACTION_VIEW); 
    Uri uri1 = Uri.parse("file:///sdcard/test.kml"); 
    mapIntent.setData(uri1); 
    startActivity(Intent.createChooser(mapIntent, "Sample")); 

Моя цель — получить тот же результат с помощью кнопки «играть».


person Waza_Be    schedule 14.07.2012    source источник


Ответы (4)


Вам необходимо указать URI файла KML И тип KML MIME следующим образом.

File file = new File(Environment.getExternalStorageDirectory(), "sample_tour.kml");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.google-earth.kml+xml");
intent.putExtra("com.google.earth.EXTRA.tour_feature_id", "my_track");
startActivity(intent);

В настоящее время это недокументировано, но мы пытаемся это исправить.

Обязательно используйте Intent::setDataAndType, а не Intent::setData и Intent::setType по отдельности (каждый из них переопределяет другой).

«my_track» — это ссылка на идентификатор вашей метки. Дополнительное намерение автоматически запускает тур.

<Placemark id="my_track">
 <gx:Track>
  ...
 </gx:Track>
</Placemark>
person saxman    schedule 14.08.2012

Можно ли использовать ссылку вместо кмл с диска? Что-то вроде этого:

intent.setDataAndType(Uri.parse("http://sites.cyclingthealps.com/other/downloads/doc.kml"), "application/vnd.google-earth.kml+xml");

Спасибо

person Dennis Wegewijs    schedule 05.12.2012

Если вы ориентируетесь на Android N, вам больше не разрешено отправлять намерение file://. Используйте инструкции в android.os.FileUriExposedException: файл: ///storage/emulated/0/test.txt доступен за пределами приложения через Intent.getData() и добавьте флаг Intent.FLAG_GRANT_READ_URI_PERMISSION.

person rockgecko    schedule 19.03.2017
comment
Был ли также переход с Android 5 на 6? Мое приложение может открывать KML в Google Планета Земля в Android 5. В Android 6 открывается Google Планета Земля, но, видимо, не получил файл KML? - person Ed of the Mountain; 08.02.2018

File KML = new File("/sdcard/doc.kml");
Intent i = getPackageManager().getLaunchIntentForPackage("com.google.earth");
i.setDataAndType(Uri.fromFile(KML), "xml");
startActivity(i);

источник: http://enladodelbien.blogspot.com/2015/06/kmlkmz-to-google-earth.html

person Mike Brian Olivera    schedule 03.07.2015