Android上无法解析MapActivity类

37

我有一个应用程序,其中包含11个不同的活动。其中一个活动是MapActivity的扩展(用于数据可视化的地图)。要进入此活动,用户必须先通过启动活动,然后通过3个其他活动。启动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}

我将目标设置为Google APIs,这是一个针对Android 1.5的应用程序,并在清单文件中指定minSdk为3级。 maps的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>

我已经花了将近两天的时间,但没有任何结果。似乎有很多人在从其他活动启动MapActivity时遇到问题,但是没有任何解决方案。有人有线索吗?谢谢。


请检查这个解决方案:https://dev59.com/2mw15IYBdhLWcg3wisW-#7644635 - Bobs
12个回答

65
问题在于你的MapVis类很可能是扩展了com.google.android.maps.MapActivity。为了使系统能够找到这个类,你需要做两件事情:
首先,请确保你的项目已经将Android maps.jar包含在构建路径中。从Eclipse中找到...
Project > Properties > Android

然后根据您的应用程序选择适当的“Google APIs”之一。 您可以通过检查以下内容来确认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
显然,在“项目>属性>Android”下选择“Google API”意味着您也选择了Android库!真烦人! - gideon
7
请确认您已将 uses-library 代码片段嵌套在 <application> 标签中。谢谢,这真是救命稻草! - radhoo
3
你救了我的命!我在清单文件中没有添加 <uses-library android:name="com.google.android.maps" /> :) - Climbatize

16

显然,我的构建环境在某个时刻出了很大问题。看起来我不知何故将谷歌API的jar文件重复添加到了项目中,导致冲突。我删除了项目并重新创建它,现在可以正常工作。


3
你知道吗,如果你接受了自己的答案,你就可以获得“自学者”徽章?你已经得到了所需的三个赞同票。 - Martin
一样的事情。在Eclipse提示我后,我手动再次将Google地图添加到构建路径中。重复几次后它仍然无法工作,因此我按照@cyber-monk的指示从构建中删除了地图jar文件。之后就可以正常工作了。 - frostymarvelous

13

我曾经遇到过完全相同的问题。

我手动将maps.jar添加到构建路径中,并将android 2.1设置为目标平台。但是这种方法似乎不起作用(特别是在2.1系统上),即使我按照教程所说的做法来操作。

我解决问题的方法是:

- 移除手动添加的maps.jar,然后将我的构建目标设置为Google APIs 2.1,而不是Android 2.1

后来我意识到,“Google” Android库中已经自动包含了maps.jar,因此两者发生了冲突。 :D


完美,那就是我的问题 :) - Daniel Kutik

5
我更新了cyber-monk的答案,因为问题不是你没有maps.jar,而是你有冲突的jar(例如,你将maps.jar与android 4.0混合使用)。
所以:
  1. 请确保在 Project > Properties > Android 中选中了Google APIs。如果没有,请选择它并点击应用。这个更改会修改文件project.properties中的目标属性,并更改包含的库。(例如,在最新的Android SDK中,你将有:target=Google Inc.:Google APIs:14)
  2. 进入Project > Properties > Java Build Path > Libraries,确保没有直接包含android.jarmaps.jar。你只需要拥有至少maps.jarandroid.jar作为叶子节点的Google Apis

3
对于正在使用Android Studio和Gradle的人:
  1. 完全删除依赖项中的maps.jar(以及添加给Google Maps的任何其他库)。
  2. 在您的项目清单和地图库(如果您正在使用地图库)模块中,在“应用程序”部分中添加此行:

    <uses-library android:name="com.google.android.maps" />

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

    compileSdkVersion "Google Inc.: Google APIs: 19"

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


2

请尝试以下步骤:

在您的Android .jar上右键单击“构建路径”->“配置构建路径”。如果您看到2个maps.jar包含,请删除其中一个...


太对了,当我在一个已有的项目中添加谷歌地图支持时,也发生了这种情况。如果你先添加代码并接受Eclipse告诉你要包括maps.jar的提示,然后再改变构建目标,你最终会在构建路径中有两个maps.jar。 - Roalt

2

John的回答对我有用。我花了很长时间才找到这个解决方案。与MapActivity一起使用的好网页在这里,它涵盖了使用时遇到的大多数问题,包括John提供的解决方案。


2
我遇到了同样的问题,后来我意识到你不能只是将地图库添加到项目中,你必须将目标更改为类似于这样的内容 target=Google Inc.:Google APIs:8 而不是 android=android-8
无论如何,感谢你给我发现了这个提示 ;)

1
我曾经遇到同样的问题,尝试了上面提出的所有解决方案(除了重建项目),但都没有成功。然后我清理了项目,问题就解决了。在Eclipse中,选择Project>Clean,勾选你的项目并点击OK即可。

我遇到了同样的问题,进行了简单的项目清理就解决了,谢谢! - pbojinov

1
在我的情况下,发现maps.jar也放在我的libs目录中。将其从该目录中移除即可解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接