我有一个有11种不同活动的应用程序。其中一项活动是MapActivity的扩展(它是数据可视化的地图)。要进行此活动,用户必须首先浏览启动活动,然后执行其他3项活动。启动MapActivity的代码是:
Intent i = new Intent(getBaseContext(), MapVis.class);
i.putExtra("edu.uml.cs.isense.visualizations.session_list", sessions);
startActivity(i);
执行此操作时,我从Log:
获得以下输出09-01 14:36:22.389: WARN/dalvikvm(592): Class resolved by unexpected DEX: Ledu/uml/cs/isense/visualizations/MapVis;(0x44981910):0x128260 ref [Lcom/google/android/maps/MapActivity;] Lcom/google/android/maps/MapActivity;(0x44981910):0x13d330
09-01 14:36:22.389: WARN/dalvikvm(592): (Ledu/uml/cs/isense/visualizations/MapVis; had used a different Lcom/google/android/maps/MapActivity; during pre-verification)
09-01 14:36:22.389: WARN/dalvikvm(592): Unable to resolve superclass of Ledu/uml/cs/isense/visualizations/MapVis; (118)
09-01 14:36:22.389: WARN/dalvikvm(592): Link of class 'Ledu/uml/cs/isense/visualizations/MapVis;' failed
09-01 14:36:22.389: DEBUG/AndroidRuntime(592): Shutting down VM
09-01 14:36:22.389: WARN/dalvikvm(592): threadid=1: thread exiting with uncaught exception (group=0x4001d7f0)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): FATAL EXCEPTION: main
09-01 14:36:22.399: ERROR/AndroidRuntime(592): java.lang.NoClassDefFoundError: edu.uml.cs.isense.visualizations.MapVis
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at edu.uml.cs.isense.visualizations.Visualizations.onOptionsItemSelected(Visualizations.java:213)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at android.app.Activity.onMenuItemSelected(Activity.java:2195)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:730)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:143)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:532)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at android.view.View$PerformClick.run(View.java:8816)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at android.os.Handler.handleCallback(Handler.java:587)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at android.os.Handler.dispatchMessage(Handler.java:92)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at android.os.Looper.loop(Looper.java:123)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at android.app.ActivityThread.main(ActivityThread.java:4627)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at java.lang.reflect.Method.invokeNative(Native Method)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at java.lang.reflect.Method.invoke(Method.java:521)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at dalvik.system.NativeStart.main(Native Method)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): Caused by: java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at dalvik.system.DexFile.defineClass(Native Method)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:209)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:203)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
09-01 14:36:22.399: ERROR/AndroidRuntime(592): ... 17 more
09-01 14:36:22.409: WARN/ActivityManager(92): Force finishing activity edu.uml.cs.isense/.visualizations.Visualizations
09-01 14:36:22.909: WARN/ActivityManager(92): Activity pause timeout for HistoryRecord{44c84a90 edu.uml.cs.isense/.visualizations.Visualizations}
我确实将目标设置为Google API,这是一款适用于Android 1.5的应用,并指定清单文件中的minsdk为3级。地图的uses-library也在清单文件中。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="edu.uml.cs.isense"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Isense" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".experiments.Experiments" android:label="@string/app_name_experiments"/>
<activity android:name=".sessions.Sessions" android:label="@string/app_name"/>
<activity android:name=".people.People" android:label="@string/app_name_people"/>
<activity android:name=".profile.Profile" android:label="@string/app_name"/>
<activity android:name=".sensors.Sensors" android:label="@string/app_name_sensors"/>
<activity android:name=".visualizations.DataTable" android:label="@string/app_name"/>
<activity android:name=".visualizations.Visualizations" android:label="@string/app_name"/>
<activity android:name=".sensors.DataListActivity"
android:label="@string/selectFile"
android:theme="@android:style/Theme.Dialog"
android:configChanges="orientation|keyboardHidden" />
<activity android:name=".sensors.Upload" android:label="@string/app_name_uploader"/>
<activity android:name=".visualizations.MapVis" android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar" />
<uses-library android:name="com.google.android.maps"/>
</application>
<uses-sdk android:minSdkVersion="3"/>
</manifest>
我已经在这里待了将近2天但没有结果。似乎有很多人在从其他活动中启动MapActivity时遇到问题,但在任何地方都没有解决方案。有人有线索吗?感谢。
答案 0 :(得分:65)
问题是您的 MapVis 类可能会扩展 com.google.android.maps.MapActivity 。为了使系统能够找到这个类,你需要做两件事:
首先确保您的项目在构建路径中包含Android maps.jar 。从Eclipse找到
Project > Properties > Android
然后根据您的应用选择一个“Google API”。您可以通过选中以下内容确认maps.jar位于您的构建路径上:
Project > Properties > Java Build Path > Libraries > Expand "Google Apis"
再次浏览到您的清单文件,并确保将uses-library
代码段嵌套在<application>
代码中,如下所示:
<manifest>
...
<application ...>
<uses-library android:name="com.google.android.maps" />
...
</application>
</manifest>
愿力量与你同在!
答案 1 :(得分:16)
显然在某些时候我的构建环境真的搞砸了。看起来我两次在我的项目中使用谷歌API jar,导致冲突。我删除了项目并重新创建它,现在可以使用。
答案 2 :(得分:13)
我有同样的问题。
我在构建路径中手动添加maps.jar并使用android 2.1作为目标。这似乎不起作用(不管怎么说都不是2.1),尽管我按照这个教程说这样做。
我是如何解决的:
- 删除手动添加的maps.jar然后我将构建目标设置为Google API 2.1而不是Android 2.1
之后我意识到maps.jar会自动包含在&#34; Google&#34; Android库这样冲突了。 :d
答案 3 :(得分:5)
我更新了网络僧侣的答案,因为问题不是你没有maps.jar,问题是你有冲突的jar(例如你将maps.jar与android 4.0混合)。 所以
Project > Properties > Android
中已选中 Google API 。如果不是这种情况,请选择它并单击“应用”。此更改将修改文件 project.properties 中的目标属性,并更改包含的库。 (例如,使用最新的android sdk,您将拥有:target=Google Inc.:Google APIs:14
)Project > Properties > Java Build Path > Libraries
并确保没有直接包含 android.jar 或 maps.jar 。您应该只有 Google Apis ,至少 maps.jar 和 android.jar 作为离开。答案 4 :(得分:3)
对于那些使用Android studio和gradle的人:
在您的项目清单和地图库中(如果您使用的是)模块在“应用程序”部分添加此行:
&LT; uses-library android:name =“com.google.android.maps”/&gt;
在您的项目build.gradle文件中(如果您使用的话,也可以在地图库gradle中)修改compileSdkVersion:
compileSdkVersion“Google Inc.:Google API:19”
清理并重建您的项目。
答案 5 :(得分:2)
我遇到了同样的问题,我意识到你不能只将地图库添加到项目中,你必须将目标更改为target=Google Inc.:Google APIs:8
而不是android=android-8
。
无论如何,谢谢你给了我发现它的提示;)
答案 6 :(得分:2)
试试这个:
在你的Android .jar上右键单击Build Path-&gt;配置构建路径。那么如果你看到2个maps.jar包括删除其中一个......答案 7 :(得分:2)
约翰的回答对我有用。我花了很长时间才遇到这个解决方案。使用MapActivity的一个很好的页面是here。它涵盖了使用它时遇到的大多数问题,包括John的解决方案。
答案 8 :(得分:1)
我遇到了同样的问题并尝试了上述所有解决方案(重建项目除外)但没有成功。然后我清理了项目并修复了它。在Eclipse Project&gt;清理检查项目并选择确定。
答案 9 :(得分:1)
在我看来,事实证明maps.jar也位于我的libs目录中。从解决问题中删除它。
答案 10 :(得分:0)
@cyber-monk's(抱歉,还不能对答案发表评论)答案类似于互联网上的其他答案,除了它显示了一个非常重要的细节,大部分都没有。您必须将标记放在标记内。大多数人只是说把它放在清单中,而不是说把它放在哪里。我把它放在里面,最后,最终让它工作
答案 11 :(得分:0)
另一个最可能的原因是,事实上存在冲突的lib,因此导致了这些ClassLoading问题,最好删除其他不必要的libs。如果您按照之前的贡献者的建议添加了谷歌地图库,那么请删除它们,以便您的项目现在如下所示。
另一个可能的原因是清单上的包声明。