ti-enxame.com

Não é possível resolver a classe MapActivity em Android

Eu tenho um aplicativo que possui 11 atividades diferentes. Uma dessas atividades é uma extensão do MapActivity (é um mapa para visualização de dados). Para chegar a essa atividade, o usuário deve primeiro percorrer a atividade de inicialização e depois outras 3 atividades. O código para iniciar o MapActivity é:

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

Quando isso é executado, recebo a seguinte saída do 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}

Eu tenho o destino definido para as APIs do Google, este é um aplicativo destinado a Android 1.5 e especifica que o minsdk deve estar no nível 3 no arquivo de manifesto. A biblioteca de usos para mapas também está em manifesto Arquivo.

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

Eu estive nisso por quase 2 dias agora sem resultados. Parece que muitas pessoas estão com problemas para iniciar um MapActivity de outras atividades, mas não há soluções em lugar algum. Alguém tem uma pista? Obrigado.

36
John

Aparentemente, em algum momento, meu ambiente de construção ficou realmente confuso. Parecia que, de alguma forma, as APIs do Google eram exibidas no meu projeto duas vezes, causando um conflito. Eu apaguei o projeto e o recriei, funciona agora.

16
John

O problema é que sua classe MapVis provavelmente está se estendendo com.google.Android.maps.MapActivity. Para que o sistema possa encontrar essa classe, você precisa fazer duas coisas:

Primeiro, verifique se o seu projeto está incluindo o Android maps.jar no seu caminho de construção.

Project > Properties > Android

Em seguida, selecione uma das "APIs do Google" conforme apropriado para seu aplicativo. Você pode confirmar que o maps.jar está no seu caminho de construção, verificando:

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

Segundo, navegue até o arquivo de manifesto e verifique se tem o uses-library snippet aninhado dentro do <application> tags da seguinte maneira:

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

Que a força esteja com você!

65
cyber-monk

Eu tive exatamente o mesmo problema.

Eu estava adicionando o maps.jar manualmente no caminho da construção e usando Android 2.1 como destino. Isso não parece funcionar (não no 2.1 de qualquer maneira)) apesar do tutorial que segui dizendo para fazê-lo como isso.

Como eu resolvi isso foi:

- Remova o maps.jar adicionado manualmente, em seguida, defino meu destino de compilação como APIs do Google 2.1 em vez de Android 2.1

Percebi depois que o maps.jar é incluído automaticamente nas "Google" Android libs, portanto, era conflitante.: D

13
Dan Harvey

Eu atualizo a resposta do cyber-monge porque o problema não é que você não possui o maps.jar, o problema é que você tem um jar conflitante (por exemplo, você mistura o maps.jar com Android 4.0).

  1. verifique se APIs do Google está marcado com Project > Properties > Android. Caso contrário, selecione-o e clique em Aplicar. Essa alteração modificará a propriedade de destino no arquivo project.properties e alterará o bibliotecas incluídas. (por exemplo, com o último Android sdk, você terá: target=Google Inc.:Google APIs:14)
  2. vamos para Project > Properties > Java Build Path > Libraries e verifique se não há Android.jar ou maps.jar incluído diretamente. Você deve ter apenas Google Apis com pelo menos maps.jar e Android.jar como folhas.
5
Damien R.

Para quem está usando o Android studio e gradle:

  1. Remova completamente o maps.jar (e quaisquer outras bibliotecas adicionadas ao google maps) das dependências.
  2. No manifesto de seus projetos e no módulo de sua biblioteca de mapas (se você estiver usando um), adicione esta linha na seção 'application':

    <biblioteca de usos Android: name = "com.google.Android.maps" />

  3. Nos seus projetos, o arquivo build.gradle (e também na biblioteca de mapas gradle, se você estiver usando um) modifique compileSdkVersion:

    compileSdkVersion "Google Inc.: APIs do Google: 19"

  4. Limpe e reconstrua seu projeto.

3
Greta Radisauskaite

Eu tive o mesmo problema e percebi que você não pode simplesmente adicionar a biblioteca de mapas ao projeto, é necessário alterar o destino para algo assim target=Google Inc.:Google APIs:8 ao invés de Android=android-8.

De qualquer forma, obrigado, você me deu a dica para descobri-lo;)

2
biquillo

A resposta de John funcionou para mim. Levei uma eternidade para encontrar essa solução. Uma ótima página para trabalhar com o MapActivity é aqui . Ele cobre a maioria dos problemas encontrados ao trabalhar com ele, incluindo a solução que John tinha.

2
Matt Becker

tente isto:

no seu Android .jar, clique com o botão direito do mouse em Build Path-> Configure Build Path., em seguida, se você vir 2 maps.jar inclui remover um deles ...

2
overburn

Eu estava tendo o mesmo problema e tentei todas as soluções propostas acima (exceto a reconstrução do projeto) sem êxito. Depois limpei o projeto e ele foi consertado. Em Projeto Eclipse> Limpar, verifique seu projeto e selecione ok.

1
kfeeney

no meu caso, o maps.jar também estava no meu diretório libs. Removê-lo do que corrigiu o problema.

1
Genia S.

Um outro motivo mais provável, como se viu, foi o fato de existirem bibliotecas conflitantes, resultando nesses problemas de ClassLoading, é bom remover as outras bibliotecas desnecessárias. Se você incluiu o Lib do google maps como sugerido por colaboradores anteriores, remova-os, para que seu projeto agora seja o seguinte abaixo.

enter image description here

enter image description here

Outra causa possível é a declaração do pacote no seu manifesto. enter image description here

0
Fred Ondieki

A resposta do @ cyber-monk (desculpe, ainda não pode comentar as respostas) é semelhante a todas as outras respostas da Internet, exceto que mostra um detalhe muito importante que a maioria deixa de fora. Você precisa colocar a tag dentro da tag. A maioria apenas diz para colocá-lo no manifesto sem dizer ONDE colocá-lo. Coloquei-o dentro e, finalmente, finalmente funcionou

0
shawalli