2010-09-01 28 views
36

Tôi có một ứng dụng có 11 hoạt động khác nhau. Một trong những hoạt động này là một phần mở rộng của MapActivity (nó là một bản đồ để hiển thị dữ liệu). Để có được hoạt động này, trước tiên người dùng phải đi qua hoạt động khởi chạy, sau đó thực hiện 3 hoạt động khác. Mã để khởi động MapActivity là:Không thể giải quyết lớp MapActivity trên Android

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

Khi điều này được thực hiện tôi nhận được đầu ra sau từ 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} 

tôi làm có mục tiêu được đặt API của Google, đây là một ứng dụng có ý nghĩa cho Android 1.5 và chỉ định minsdk là cấp 3 trong tệp kê khai. sử dụng-thư viện cho bản đồ cũng nằm trong tệp kê khai.

<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> 

Tôi đã ở đây trong gần 2 ngày mà không có kết quả. Dường như có rất nhiều người gặp sự cố khi khởi chạy MapActivity từ các hoạt động khác nhưng không có giải pháp nào ở bất kỳ đâu. Có ai có gợi ý gì không? Cảm ơn.

+0

kiểm tra giải pháp này http://stackoverflow.com/a/7644635/779408 – breceivemail

Trả lời

16

Dường như một lúc nào đó môi trường xây dựng của tôi đã thực sự bị rối tung lên. Dường như tôi bằng cách nào đó đã có jar API của Google trong dự án của tôi hai lần, gây ra xung đột. Tôi đã xóa dự án và tạo lại nó, hoạt động ngay bây giờ.

+3

Bạn có biết rằng bạn chấp nhận câu trả lời của riêng mình để nhận được huy hiệu “Tự học” không? Bạn đã có ba phiếu bầu cần thiết. – Martin

+0

Điều tương tự. Tôi tự thêm bản đồ google vào đường dẫn xây dựng một lần nữa sau khi nhật thực nhắc tôi. Sau khi tái tạo một vài lần và nó không hoạt động, tôi đã làm theo hướng dẫn không dây ảo và loại bỏ các bản đồ jar từ xây dựng. đã làm việc rất tốt sau đó. – frostymarvelous

2

Tôi gặp vấn đề tương tự và tôi nhận ra rằng bạn không thể thêm thư viện bản đồ vào dự án, bạn phải thay đổi mục tiêu thành một cái gì đó như thế này target=Google Inc.:Google APIs:8 thay vì android=android-8.

Dù sao cảm ơn bạn đã cho tôi gợi ý để khám phá nó;)

2

thử điều này:

trên Android .jar nhấn chuột phải Build Path-> Configure Build Path. sau đó nếu bạn thấy 2 maps.jar bao gồm loại bỏ một trong số họ ...

+0

Đúng vậy, điều này cũng xảy ra với tôi khi tôi thêm hỗ trợ Google Maps vào một dự án hiện có. Nếu trước tiên bạn thêm mã và chấp nhận khi Eclipse yêu cầu bạn bao gồm maps.jar và sau đó thay đổi mục tiêu xây dựng, bạn kết thúc với 2 maps.jar trong đường dẫn xây dựng của bạn. – Roalt

65

Vấn đề là lớp MapVis của bạn có khả năng mở rộng com.google.android.maps.MapActivity. Để hệ thống có thể tìm thấy lớp học này, bạn cần phải làm hai việc:

Trước tiên hãy đảm bảo dự án của bạn bao gồm Android maps.jar trong đường dẫn xây dựng của bạn. Từ Eclipse, hãy tìm

Project > Properties > Android 

Sau đó chọn một trong các "API Google" thích hợp cho ứng dụng của bạn. Bạn có thể xác nhận maps.jar đó là trên con đường xây dựng của bạn bằng cách kiểm tra:

Project > Properties > Java Build Path > Libraries > Expand "Google Apis" 

duyệt thứ hai đến file manifest của bạn và chắc chắn rằng bạn có đoạn uses-library lồng trong <application> thẻ như sau:

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

Có thể có hiệu lực với bạn!

+1

dường như trong 'Project> Properties> Android' chọn 'google api' có nghĩa là bạn cũng đang chọn thư viện android! Grr! – gideon

+7

"" đảm bảo bạn có đoạn mã sử dụng-thư viện được lồng trong thẻ "" trình tiết kiệm cuộc sống thực, cảm ơn bạn! – radhoo

+3

Bạn đã cứu mạng tôi! Tôi đã không thêm '' vào tệp kê khai của tôi :) – Climbatize

1

Tôi đã gặp vấn đề tương tự và đã thử tất cả các giải pháp được đề xuất ở trên (ngoại trừ việc xây dựng lại dự án) mà không thành công. Sau đó, tôi làm sạch dự án và nó đã được cố định. Trong Eclipse Project> Clean kiểm tra dự án của bạn và chọn ok.

+0

có cùng sự cố và đơn giản dự án sạch đã làm các trick, cảm ơn! – pbojinov

2

Câu trả lời của John đã hiệu quả đối với tôi. Nó đã cho tôi mãi mãi để đi qua giải pháp này.Một trang tuyệt vời để làm việc với MapActivity là here. Nó bao gồm hầu hết các vấn đề gặp phải khi làm việc với nó, bao gồm cả giải pháp mà John có.

13

Tôi gặp vấn đề tương tự.

Tôi đã thêm map.jar theo cách thủ công trong đường dẫn xây dựng và sử dụng android 2.1 làm mục tiêu. Điều này dường như không làm việc (không phải trên 2,1 anyway) mặc dù hướng dẫn tôi theo sau nói rằng để làm điều đó như thế này.

Làm thế nào tôi giải quyết đó là:

-Xoá các maps.jar bằng tay thêm sau đó tôi đặt xây dựng mục tiêu của tôi đến các API của Google 2.1 thay vì Android 2,1

tôi nhận ra sau đó rằng maps.jar được tự động đưa vào "Google" Android libs nên xung đột. : D

+0

hoàn hảo đó là vấn đề của tôi :) –

0

@ cyber-monk's (xin lỗi, không thể nhận xét về câu trả lời) câu trả lời tương tự như mọi câu trả lời khác trên internet, ngoại trừ việc nó hiển thị một chi tiết rất quan trọng mà hầu hết bỏ qua. Bạn phải đặt thẻ trong thẻ. Hầu hết chỉ nói để đặt nó trong bản kê khai mà không nói WHERE để đặt nó. Tôi đặt nó vào trong và cuối cùng, FINALLY đã nhận nó hoạt động

5

Tôi cập nhật câu trả lời không gian mạng vì vấn đề không phải là bạn không có map.jar, vấn đề là bạn có xung đột (ví dụ: bạn trộn bản đồ. jar với Android 4.0). Vì vậy

  1. đảm bảo rằng Google API được kiểm tra trong Project > Properties > Android. Nếu trường hợp đó không được chọn, hãy nhấp vào áp dụng. Thay đổi này sẽ sửa đổi thuộc tính mục tiêu trong tệp project.properties và thay đổi các thư viện được bao gồm . (Ví dụ với Android SDK mới nhất, bạn sẽ có: target=Google Inc.:Google APIs:14)
  2. đi đến Project > Properties > Java Build Path > Libraries và đảm bảo rằng không có android.jar hoặc maps.jar trực tiếp bao gồm. Bạn chỉ nên có Google Apis với ít nhất bản đồ.jarandroid.jar làm lá.
1

trong trường hợp của tôi, hóa ra là maps.jar cũng đang nằm trong thư mục libs của tôi. Xóa nó khỏi sự cố đã khắc phục.

0

Một lý do khác có thể xảy ra nhất là thực tế là có các thư điện tử xung đột, do đó dẫn đến các sự cố ClassLoading đó là cách tốt để loại bỏ các thư viện không cần thiết khác. Nếu bạn đã bao gồm các bản đồ google Lib theo đề xuất của những người đóng góp trước đó thì hãy xóa chúng, sao cho dự án của bạn bây giờ trông giống như dưới đây.

enter image description here

enter image description here

Một nguyên nhân có thể là việc kê khai gói trên biểu hiện của bạn. enter image description here

3

Đối với những người đang sử dụng Android studio và gradle:

  1. Tháo gỡ hoàn toàn maps.jar (và bất kỳ libs khác bổ sung cho các bản đồ google) từ phụ thuộc.
  2. Trong các dự án của bạn biểu hiện và trong các bản đồ-thư viện của bạn (nếu bạn đang sử dụng một) mô-đun thêm dòng này trong 'ứng dụng' phần:

    < sử dụng thư viện android: name = "com.google.android. bản đồ"/>

  3. trong các dự án của bạn build.gradle tập tin (và cũng có thể trong các bản đồ thư viện gradle nếu bạn đang sử dụng một) sửa đổi compileSdkVersion:

    compileSdkVersion "Google Inc.:Google API: 19"

  4. Làm sạch và xây dựng lại dự án của bạn.

Các vấn đề liên quan