无法使用OSMBonusPack库解析KML文件

时间:2014-02-13 23:24:01

标签: android openstreetmap osmdroid

我正在尝试使用Osmdroid和Osmdroidbonuspack编写一个简单的Android应用程序,但是我在按照教程中的基本示例进入第一阶段时遇到了问题。

我可以使用osmdroid显示地图,但是当我尝试使用osmdroidbonuspack解析网址时,解析器总是返回false。

我使用的网址是本教程中的“巴黎之旅”: http://code.google.com/p/osmbonuspack/wiki/Tutorial_3

我知道文件存在,因为链接有效。

我的主要活动中的代码是:

    mMapView = (MapView) findViewById(R.id.mapview);
    mMapView.setTileSource(TileSourceFactory.MAPNIK);
    mMapView.setBuiltInZoomControls(true);
    mMapController = (MapController) mMapView.getController();
    mMapController.setZoom(2);

    KmlDocument kmlDocument = new KmlDocument();
    boolean ok = kmlDocument.parseUrl("http://mapsengine.google.com/map/kml?mid=z6IJfj90QEd4.kUUY9FoHFRdE");

我应该补充一下,我注意到logcat中有一些与网络相关的错误:

02-13 23:28:28.177: W/System.err(1652): android.os.NetworkOnMainThreadException
02-13 23:28:28.181: W/System.err(1652):     at    android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
02-13 23:28:28.181: W/System.err(1652):     at     java.net.InetAddress.lookupHostByName(InetAddress.java:385)
02-13 23:28:28.185: W/System.err(1652):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
02-13 23:28:28.185: W/System.err(1652):     at java.net.InetAddress.getAllByName(InetAddress.java:214)
02-13 23:28:28.185: W/System.err(1652):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
02-13 23:28:28.185: W/System.err(1652):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
02-13 23:28:28.189: W/System.err(1652):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
02-13 23:28:28.189: W/System.err(1652):     at    org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
02-13 23:28:28.189: W/System.err(1652):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
02-13 23:28:28.193: W/System.err(1652):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
02-13 23:28:28.193: W/System.err(1652):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
02-13 23:28:28.193: W/System.err(1652):     at org.osmdroid.bonuspack.utils.HttpConnection.doGet(HttpConnection.java:75)
02-13 23:28:28.197: W/System.err(1652):     at org.osmdroid.bonuspack.kml.KmlDocument.parseUrl(KmlDocument.java:231)
02-13 23:28:28.197: W/System.err(1652):     at com.example.testosmdroid.MainActivity.onCreate(MainActivity.java:29)
02-13 23:28:28.197: W/System.err(1652):     at android.app.Activity.performCreate(Activity.java:5008)
02-13 23:28:28.197: W/System.err(1652):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
02-13 23:28:28.201: W/System.err(1652):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
02-13 23:28:28.201: W/System.err(1652):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
02-13 23:28:28.201: W/System.err(1652):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
02-13 23:28:28.201: W/System.err(1652):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
02-13 23:28:28.205: W/System.err(1652):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-13 23:28:28.205: W/System.err(1652):     at android.os.Looper.loop(Looper.java:137)
02-13 23:28:28.205: W/System.err(1652):     at android.app.ActivityThread.main(ActivityThread.java:4745)
02-13 23:28:28.209: W/System.err(1652):     at java.lang.reflect.Method.invokeNative(Native Method)
02-13 23:28:28.209: W/System.err(1652):     at java.lang.reflect.Method.invoke(Method.java:511)
02-13 23:28:28.209: W/System.err(1652):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
02-13 23:28:28.213: W/System.err(1652):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-13 23:28:28.213: W/System.err(1652):     at dalvik.system.NativeStart.main(Native Method)

MainActivity中的错误发生在parseUrl行。 当我看到这个时,我认为这可能是由于权限问题,但我刚检查过,似乎我拥有所有必需的权限,至少根据本教程:http://code.google.com/p/osmdroid/wiki/Prerequisites

我的AndroidManifest如下:

<?xml version="1.0" encoding="utf-8"?>

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="19" />

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.testosmdroid.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

1 个答案:

答案 0 :(得分:0)

下车,回过头来阅读更多文档我已回答了我自己的问题。从他们的其他教程之一:

  

为了清晰和简单,在这些教程中,我们在主线程中执行所有API调用。

     

通常,对于网络调用,根本不推荐这样做:我们应该使用线程和异步任务。甚至最糟糕的是,自Honeycomb SDK(3.0)以来,不允许在主线程中进行网络调用(由于“StrictMode.ThreadPolicy”默认设置,将引发NetworkOnMainThreadException异常)。

     

所以:       对于这些教程,请定位早于3.0的SDK       一旦您使用了tutos并想要在您的真实应用程序上工作,请查看OSMBonusPackDemo源代码,其中网络调用在异步任务中完成。

按照他们的建议后,它现在正确解析。