2010-09-01 94 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. 清理並重建您的項目。