我正在尝试使用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>
答案 0 :(得分:0)
下车,回过头来阅读更多文档我已回答了我自己的问题。从他们的其他教程之一:
为了清晰和简单,在这些教程中,我们在主线程中执行所有API调用。
通常,对于网络调用,根本不推荐这样做:我们应该使用线程和异步任务。甚至最糟糕的是,自Honeycomb SDK(3.0)以来,不允许在主线程中进行网络调用(由于“StrictMode.ThreadPolicy”默认设置,将引发NetworkOnMainThreadException异常)。
所以: 对于这些教程,请定位早于3.0的SDK 一旦您使用了tutos并想要在您的真实应用程序上工作,请查看OSMBonusPackDemo源代码,其中网络调用在异步任务中完成。
按照他们的建议后,它现在正确解析。