【问题标题】:How can I send a kml file to Google Earth, like MyTracks (open source) do?如何像 MyTracks(开源)一样将 kml 文件发送到 Google 地球?
【发布时间】:2012-07-14 12:15:44
【问题描述】:

我不知道您是否看过令人惊叹的 Mytrack 更新,但它允许将 kml 文件发送到 Google 地球应用并在 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")); 

我的目标是通过“播放”按钮获得相同的结果。

【问题讨论】:

    标签: android android-intent kml google-earth


    【解决方案1】:

    您需要指定 KML 文件的 URI 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::setDataIntent::setType(它们各自覆盖另一个)。

    “my_track”是对您的地标 ID 的引用。 Intent extra 会自动启动游览。

    <Placemark id="my_track">
     <gx:Track>
      ...
     </gx:Track>
    </Placemark>
    

    【讨论】:

      【解决方案2】:

      是否可以使用链接而不是磁盘中的 kml? 像这样的:

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

      谢谢

      【讨论】:

        【解决方案3】:

        如果您的目标是 Android N,则不再允许发送 file:// 意图。使用 android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyond app through Intent.getData() 处的说明,并添加 Intent.FLAG_GRANT_READ_URI_PERMISSION 标志。

        【讨论】:

        • Android 5 到 6 是否也发生了变化?我的应用可以在 Android 5 的 Google 地球中打开 KML。在 Android 6 中,Google 地球会打开,但它显然没有收到 KML 文件?
        【解决方案4】:
        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多