调用gpx app的意图

时间:2018-04-16 10:09:33

标签: android gpx

我的Android应用是帮助地图绘制Orienteering地图的工具。他/她不使用GPS设备和小册子,而是使用手机记录这些IOF元素,然后以.gpx格式保存,可以由绘制地图的CAD软件读取。

它没有图形界面。我的想法是使用一个已经可用的应用程序来绘制gpx文件中的曲目。我用两个非常好的测试进行了一些测试:GPXViewer和Locus Map。

当我触发下面的意图时,两者都以同样的方式反应说我要求显示的文件存在问题,“TestGPX.gpx”保存在手机的Documents目录中。在这两种情况下,我打电话的应用程序打开但是抱怨,更具体的是Locus:“无效的值:content://com.hbcavalcanti.com.isomspinner1.fileprovider/Documments/TestGPX.gpx”。

由于它们是打开的,如果我手动选择文件,则两者都没有任何问题。我怀疑是不是偶然都抱怨,即我应该做的事情不对:

    public void viewGPXVButton(View view){
    // Get directory Documents
    File root = android.os.Environment.getExternalStoragePublicDirectory
            (Environment.DIRECTORY_DOCUMENTS);
    // Form fileprovider
    String fileProvider = getPackageName()+".fileprovider";
    // Get complete file name. Use a fixed filename "TestGPX.gpx" just to make shure
    File file = new File(root , "TestGPX.gpx");
    // Get file URI
    try{
        Uri attachment = getUriForFile(getApplicationContext(), fileProvider, file);
        // Send it
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(attachment,"application/gpx");
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        // Check the app is pressent
        if (intent.resolveActivity(getPackageManager())!= null){
            // Yes
            startActivity(intent);
        }else {
            // No
            Toast.makeText(getApplicationContext(),
                  "GPX viewer not installed", Toast.LENGTH_LONG ).show();
        }
    }
    // Fail to call
    catch (IllegalArgumentException e){
        Toast.makeText(getApplicationContext(),
                "Fail to open GPX viewer", Toast.LENGTH_LONG ).show();
    }
    finish();
}

这就是Debug所说的:

root:"/storage/emulated/0/Documents"
fileProvider:"com.hbcavalcanti.isomspinner1.fileprovider"
file:"/storage/emulated/0/Documents/TestGPX.gpx"
attachment:"content://com.hbcavalcanti.isomspinner1.fileprovider/Documents/TestGPX.gpx"

这是我Manifest的一部分:

        <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.hbcavalcanti.isomspinner1.fileprovider"
        android:grantUriPermissions="true"
        android:exported="false">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/filepaths" />
    </provider>

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

https://github.com/k3b/LocationMapViewer/还能够在gpx1.0 and gpx1.1 format中读取gpx文件。

由于它是开源的,你可以调试发生的事情。你必须添加&#34;内容:gpx&#34; uris表示你的用例使它适用于非文件uri-s。

de.k3b.android.LocationMapViewer#loadGeoPointDtosFromFile()已经使用contentResolver.openInputStream()

其他可能有用的有用工具:

所有讨论的Android应用程序都可以在f-droid app store

上免费获得

答案 1 :(得分:0)

Locus Map应用程序还具有其自己的公共API,供第三方开发人员使用。 选中this API class,以允许直接将曲目发送到应用程序中,而无需在中间使用任何GPX文件。这样,您可以简单地在“轨迹地图”地图上实时显示轨迹,而您的应用程序可以在后台进行工作。

我不确定这是否是您要实现的用例,或者不确定这些点是否真的“仅”用于在手机上显示GPX轨迹。如果秒是正确的,则也许更有用的方法可能是将轨道导出到KML文件中,这也受Google地球支持,并且(不确定)也直接由Google Maps应用支持。