Android Explicit Intent выдает ошибку NoClassDefFound

Я пытаюсь использовать явное намерение для отображения MapView в моем приложении для Android. Хотя я не вижу ничего плохого в своем коде, я продолжаю получать «NoClassDefFoundError», когда пытаюсь начать свою деятельность. По сути, из моей основной деятельности (SetCriteria) я создаю явное намерение, когда пользователь нажимает кнопку:

 Log.i(TAG, "Showing map..");
 try{
   Intent intentMap = new Intent(view.getContext(), AddLocation.class);
   startActivity(intentMap);
}catch(Throwable ex) {
   Log.e(TAG, "Error occured while trying to display map", ex);
}

Мой LogCat отображает:

 java.lang.NoClassDefFoundError: com.adm.AddLocation
 ...
 Caused by: java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation

Мой манифест выглядит так:

<application android:label="@string/app_name" android:icon="@drawable/ic_launcher_red">
    <uses-library android:name="com.google.android.maps"/>              
    <activity android:name=".SetCriteria"
              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=".AddLocation" 
          android:label="@string/add_location">         
    </activity>
</application>

У меня только один пакет: com.adm. Так что же может быть не так? У меня нет проблем с запуском карты с помощью Intent(Intent.ACTION_VIEW, uri), но я хочу, чтобы моя конкретная деятельность касалась карты.


person joanna    schedule 01.05.2011    source источник


Ответы (2)


Вы должны удалить "." (точку) перед именем вашего класса во втором объявлении активности, чтобы это выглядело так:

<activity android:name="AddLocation" android:label="@string/add_location">
person rekaszeru    schedule 01.05.2011
comment
Теперь работает, спасибо. Мне даже не приходило в голову, что это была проблема, поскольку я читал в «Android в действии» Мэннинга, что отсутствие точки иногда приводит к многочасовой отладке ... и что она всегда должна быть там. - person joanna; 01.05.2011
comment
Правильно, если он отсутствует в панели запуска/основной активности. Однако я отлаживал несколько часов, пока не обнаружил, что другим действиям это не нужно, за исключением случаев, когда они находятся во внутреннем пакете, например com.adm.activities. Затем вы должны объявить его как android:name=".activities.AddLocation". +1 за вопрос, надеюсь, это поможет и другим! - person rekaszeru; 01.05.2011
comment
Я видел ту же проблему, NoClassDefFondError при попытке явного запуска намерения MapActivity. Однако . в манифесте, похоже, не имеет никакого эффекта. Моя проблема заключалась в том, что в моем манифесте отсутствовала строка ‹uses-library android:name=com.google.android.maps/›. +1 за разъяснение по использованию его с внутренними пакетами. - person plainjimbo; 23.05.2011
comment
Даже после добавления использует библиотеку для карт. У меня была такая же проблема. Затем я обнаружил, что явно добавлял maps.jar и использовал google api в качестве Android SDK по умолчанию. Я считаю, что уже включает в себя карты. Типа дублирование, я думаю. Странно, что он показывал ошибку в классе активности! - person Vijay Krishna; 06.06.2011

Из фрагмента манифеста непонятно, какой пакет вы определили.

Вам нужно поместить его в элемент манифеста верхнего уровня:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.adm"
          >

    <application android:icon="@drawable/icon" android:label="@string/app_name" ...

Если вы этого не сделаете, система не будет использовать пакет, и ваша активность ".AddLocation" закончится как "AddLocation" без класса, что не совпадает с com.adm.AddLocation.

person Heiko Rupp    schedule 01.05.2011
comment
Я просто не публиковал весь свой манифест, но объявление пакета было в порядке. Что-то еще было причиной проблемы. Спасибо за ваш ответ в любом случае - person joanna; 01.05.2011