Ответ 1
По-видимому, в какой-то момент моя среда сборки действительно перепуталась. Похоже, что я как-то дважды использовал API-интерфейс google API в своем проекте, вызывая конфликт. Я удалил проект и воссоздал его, теперь работает.
У меня есть приложение, которое имеет 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}
У меня есть целевой набор для API Google, это приложение, предназначенное для Android 1.5, и указывает, что minsdk будет уровнем 3 в файле манифеста. 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>
Я занимаюсь этим уже почти 2 дня без каких-либо результатов. Похоже, что есть много людей, имеющих проблемы с запуском MapActivity из других видов деятельности, но нигде нет решений. У кого-нибудь есть ключ? Спасибо.
По-видимому, в какой-то момент моя среда сборки действительно перепуталась. Похоже, что я как-то дважды использовал API-интерфейс google API в своем проекте, вызывая конфликт. Я удалил проект и воссоздал его, теперь работает.
Проблема заключается в том, что класс 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>
Пусть сила будет с вами!
У меня была такая же проблема.
Я добавлял maps.jar вручную в путь сборки и использовал в качестве цели android 2.1. Кажется, что это не работает (хотя и не на 2.1), несмотря на то, что я последовал за этим, чтобы сделать это так.
Как я решил, что это было:
-Удалить добавленный вручную maps.jar, тогда я установил цель сборки для Google API 2.1 вместо Android 2.1
Я понял впоследствии, что maps.jar автоматически включается в "Google" Android-библиотеки, поэтому противоречиво.: D
Я обновляю кибер-монах, потому что проблема заключается не в том, что у вас нет maps.jar, проблема в том, что у вас конфликтная банка (например, вы смешиваете maps.jar с Android 4.0). Итак,
Project > Properties > Android
. Если это не так, выберите его и нажмите "Применить". Это изменение изменит свойство target в файле project.properties и изменит включенные библиотеки. (например, с последним sdk для Android, у вас будет: target=Google Inc.:Google APIs:14
)Project > Properties > Java Build Path > Libraries
и убедитесь, что в нем нет android.jar или maps.jar. У вас должен быть Google Apis, по крайней мере, maps.jar и android.jar как листья.Для тех, кто использует студию Android и gradle:
В манифесте проектов и в вашей карте-библиотеке (если вы используете один) модуль добавьте эту строку в раздел "приложение":
< use-library android: name= "com.google.android.maps" /" >
В ваших проектах build.gradle файл (а также в библиотеке карт gradle, если вы используете его), измените compileSdkVersion:
compileSdkVersion "Google Inc.: API Google: 19"
Очистите и перестройте проект.
У меня была такая же проблема, и я понял, что вы не можете просто добавить библиотеку карт в проект, вам нужно изменить цель на что-то вроде target=Google Inc.:Google APIs:8
вместо android=android-8
.
В любом случае спасибо, что ты дал мне подсказку, чтобы открыть его;)
попробуйте следующее:
на вашем Android.jar щелкните правой кнопкой мыши "Путь сборки" → "Настроить путь сборки". то если вы видите, что 2 maps.jar включает удаление одного из них...
Джон ответ работал на меня. Мне потребовалось навсегда найти это решение. Отличная страница для работы с MapActivity здесь. Он охватывает большинство проблем, возникающих при работе с ним, включая решение, которое имел Джон.
У меня была такая же проблема, и я пробовал все вышеперечисленные предлагаемые решения (кроме восстановления проекта) без успеха. Затем я очистил проект, и он был исправлен. В проекте Eclipse > Очистите свой проект и выберите ОК.
в моем случае оказалось, что maps.jar также сидел в моем каталоге libs. Удаление из него устраняло проблему.
@cyber-monk (извините, не могу комментировать ответы) ответ подобен любому другому ответу в Интернете, за исключением того, что он показывает одну очень важную деталь, которую большинство не учитывает. Вы должны поместить тег в тег. Большинство просто говорят, чтобы выразить это в манифесте, не сказав ГДЕ, чтобы сказать это. Я положил его внутрь и, наконец, НАКОНЕЦ получил его на работу
Еще одна наиболее вероятная причина, по которой выяснилось, заключалась в том, что были конфликтующие библиотеки, поэтому в результате возникают проблемы с ClassLoading, хорошо удалить другие ненужные библиотеки. Если вы включили google maps Lib, как было предложено предыдущими участниками, удалите их, чтобы ваш проект выглядел следующим образом.
Другая возможная причина - это объявление пакета в вашем манифесте.