2010-09-01 85 views
36

我有一个应用程序有11个不同的活动。其中一项活动是MapActivity的扩展(它是数据可视化的地图)。要参加此活动,用户必须首先完成发布活动,然后进行其他3项活动。启动MapActivity的代码是:无法解析Android上的MapActivity类

Intent i = new Intent(getBaseContext(), MapVis.class); 
i.putExtra("edu.uml.cs.isense.visualizations.session_list", sessions); 
startActivity(i); 

当这样执行我从日志输出如下:

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} 

我有目标设置为谷歌的API,这意味着一个应用程序对于Android 1.5,并且将清单文件中的minsdk指定为级别3。用于映射的库也在清单文件中。

<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

检查该解决方案http://stackoverflow.com/a/7644635/779408 – breceivemail 2012-10-27 07:41:45

回答

16

显然在某个时候我的构建环境真的搞砸了。它看起来像我有两次在我的项目中的谷歌API罐,导致冲突。我删除了该项目并重新创建了它,现在就开始工作。

+3

你知道,如果你知道接受你自己的答案你得到的“自我学习”徽章?你已经得到了所需的三张选票。 – Martin 2011-04-08 09:28:16

+0

同样的事情。我在eclipse提示我之后再次手动将Google地图添加到构建路径中。在重新创建了几次并且它不工作后,我遵循@ cyber-monk指令并从构建中移除了地图jar。之后工作很好。 – frostymarvelous 2012-02-09 16:29:55

2

我有同样的问题,我意识到你不能只是将地图库添加到项目中,你必须将目标更改为这样的target=Google Inc.:Google APIs:8而不是android=android-8

无论如何谢谢你给我的暗示,发现它;)

2

试试这个:在您的Android

的.jar右键单击构建路径 - >配置构建路径。那么,如果你看到2 maps.jar包括删除其中的一个......

+0

所以,当我将Google地图支持添加到现有项目时,这也发生在我身上。如果您首先添加代码并在Eclipse中告诉您包含maps.jar时接受,然后更改构建目标,则最终将在构建路径中包含2个maps.jar。 – Roalt 2011-12-14 15:01:30

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

显然在'Project> Properties> Android'选择'google api'意味着你也选择了android库!儿! – gideon 2011-11-20 07:28:08

+7

“”确保你有嵌套在标签内的uses库代码片段“”真正的生活保护,谢谢! – radhoo 2011-11-25 13:55:35

+3

你救了我的命!我没有在我的清单中添加'' – Climbatize 2012-05-15 07:52:11

1

我有同样的问题,并尝试了所有上述建议的解决方案(重建项目除外)没有成功。然后我清理了这个项目,它被修复了。在Eclipse Project> Clean中检查你的项目并选择ok。

+0

有同样的问题和简单项目干净的伎俩,谢谢! – pbojinov 2012-04-21 09:39:14

2

约翰的答案为我工作。我永远花了我的时间来找到这个解决方案。使用MapActivity的一个很棒的页面是here。它涵盖了使用它时遇到的大部分问题,包括John所提供的解决方案。

13

我有这个完全相同的问题。

我在构建路径中手动添加maps.jar,并使用android 2.1作为目标。这似乎并没有工作(无论如何不管2.1),尽管教程我跟着说这样做。

我如何解决它:

- 删除手动添加的maps.jar然后设置我的构建目标,以谷歌的API 2.1,而不是Android 2.1的

我后来意识到maps.jar会自动包含在“Google”Android库中,因此存在冲突。 :D

+0

完美的是我的问题:) – 2012-10-22 11:13:06

0

@ cyber-monk's(对不起,不能评论答案)答案类似于互联网上的其他所有答案,只是它显示了一个非常重要的细节,大多数情况下都没有。你必须把标签放在标签内。大多数人只是说,把它放在清单中,而不是说在哪里放。我把它放在里面,最后,终于把它工作

5

我更新网络和尚的答案,因为问题不是你没有maps.jar,问题是你有冲突的jar(例如你混合地图。 jar与Android 4.0)。 所以

  1. 确保谷歌的APIProject > Properties > Android检查。如果不是这种情况,请选择它并点击应用。此更改将修改文件project.properties中的目标属性,并更改包含的库。 (最新的Android SDK e.g,你将有:target=Google Inc.:Google APIs:14
  2. Project > Properties > Java Build Path > Libraries,并确保没有的android.jarmaps.jar直接计入。您应该只有Google Apis至少有maps.jarandroid.jar作为叶子。
1

在我的情况下,事实证明maps.jar也坐在我的libs目录中。从中解决问题。

0

另一个最可能的原因是因为存在冲突的库,所以导致这些ClassLoading问题,最好删除其他不需要的库。如果您已经按照以前的贡献者的建议包含了Google地图库,那么请删除它们,以便您的项目现在看起来如下所示。

enter image description here

enter image description here

另一个可能的原因是你的清单中的包声明。 enter image description here

3

对于那些谁使用的是Android工作室和gradle这个:

  1. 彻底清除maps.jar(并增加了对谷歌地图的任何其他库)的依赖。
  2. 在您的项目清单,并在您的地图库(如果你正在使用一个)模块加入这一行中“应用”部分:

    <使用库机器人:名字=“com.google.android。地图” />

  3. 在你的项目的build.gradle文件(并在地图的gradle库如果您正在使用一个)修改compileSdkVersion:

    compileSdkVersion “谷歌Inc.:Google的API:19”

  4. 清理并重建您的项目。