我的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>
有什么想法吗?
答案 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应用支持。