Не удается разрешить класс MapActivity на Android - PullRequest
36 голосов
/ 01 сентября 2010

У меня есть приложение, которое имеет 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 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 из других действий, но нигде нет решений. У кого-нибудь есть ключ? Благодаря.

Ответы [ 12 ]

65 голосов
/ 19 апреля 2011

Проблема в том, что ваш MapVis класс, вероятно, расширяется com.google.android.maps.MapActivity .Чтобы система могла найти этот класс, вам нужно сделать две вещи:

Сначала убедитесь, что ваш проект включает Android maps.jar в путь сборки.В Eclipse найдите

Project > Properties > Android

Затем выберите один из «API Google» в соответствии с вашим приложением.Вы можете подтвердить, что 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>

Да пребудет с тобой сила!

16 голосов
/ 01 сентября 2010

По-видимому, в какой-то момент моя среда сборки действительно испортилась.Похоже, что в моем проекте дважды почему-то возникла баночка API Google, что вызвало конфликт.Я удалил проект и воссоздал его, теперь работает.

13 голосов
/ 20 июля 2011

У меня была точно такая же проблема.

Я добавлял maps.jar вручную в путь сборки и использовал Android 2.1 в качестве цели. Это, похоже, не работает (в любом случае не на 2.1), несмотря на то, что я следовал учебнику, сказав, что делать это так.

Как я решил это было:

-Удалите вручную добавленный maps.jar, затем я установил в качестве цели моей сборки API Google 2.1 вместо Android 2.1

Впоследствии я понял, что maps.jar автоматически включается в библиотеки Google для Android, поэтому возник конфликт. : D

5 голосов
/ 11 декабря 2011

Я обновляю ответ cyber-monk, потому что проблема не в том, что у вас нет maps.jar, проблема в том, что у вас конфликтующий jar (например, вы смешиваете maps.jar с android 4.0). Итак

  1. убедитесь, что Google APIs установлен в Project > Properties > Android. Если это не так, выберите его и нажмите «Применить». Это изменение изменит целевое свойство в файле project.properties и изменит включенные библиотеки . (например, с последней версией Android SDK, вы будете иметь: target=Google Inc.:Google APIs:14)
  2. перейдите на Project > Properties > Java Build Path > Libraries и убедитесь, что нет android.jar или maps.jar . Вы должны иметь только Google Apis с по крайней мере maps.jar и android.jar в качестве листьев.
3 голосов
/ 09 сентября 2014

Для тех, кто использует Android studio и Gradle:

  1. Полностью удалите maps.jar (и любые другие библиотеки, добавленные для карт Google) из зависимостей.
  2. В манифесте ваших проектов и в модуле вашей карты-карт (если вы его используете) добавьте эту строку в раздел 'application':

    <Использования библиотеки android: name = "com.google.android.maps" />

  3. В файле вашего проекта build.gradle (а также в gradle библиотеки карт, если вы его используете) измените compileSdkVersion:

    compileSdkVersion "Google Inc.: API Google: 19"

  4. Очистите и восстановите ваш проект.

2 голосов
/ 29 июня 2011

Ответ Джона сработал для меня. Мне понадобилось навсегда, чтобы найти это решение. Отличная страница для работы с MapActivity - здесь . Он охватывает большинство проблем, возникающих при работе с ним, включая решение, которое имел Джон.

2 голосов
/ 12 апреля 2011

попробуйте это:

на вашем Android .jar щелкните правой кнопкой мыши Build Path-> Configure Build Path.тогда, если вы видите 2 maps.jar включает в себя удалить один из них ...

2 голосов
/ 13 ноября 2010

У меня была та же проблема, и я понял, что вы не можете просто добавить библиотеку карт в проект, вам нужно изменить цель на что-то вроде target=Google Inc.:Google APIs:8 вместо android=android-8.

Во всяком случае, спасибо, что вы дали мне подсказку, чтобы обнаружить его;)

1 голос
/ 09 мая 2013

в моем случае оказалось, что maps.jar также находится в моем каталоге libs.Удаление этого исправило проблему.

1 голос
/ 28 апреля 2011

У меня возникла та же проблема, и я попробовал все предложенные выше решения (кроме перестройки проекта), но безуспешно.Затем я очистил проект, и он был исправлен.В Eclipse Project> Clean проверьте ваш проект и выберите ok.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...