2015-10-12 5 views
16

Quindi mi sto connettendo al client API di google come questo.GoogleApiClient.connect() 'doveva essere di tipo interfaccia ma è risultato essere virtuale

 googleApiClient = new GoogleApiClient.Builder(context) 
     .addApi(LocationServices.API) 
     .addApi(ActivityRecognition.API) 
     .addConnectionCallbacks(this) 
     .addOnConnectionFailedListener(this) 
     .build(); 
     googleApiClient.connect(); 

Questo stesso identico codice sto usando in diversi posti e funziona bene. Non è diverso da quello che vedi nei loro tutorial. Ma ora:

java.lang.IncompatibleClassChangeError: The method 'void com.google.android.gms.common.api.GoogleApiClient.connect()' was expected to be of type interface but instead was found to be of type virtual (declaration of 'java.lang.reflect.ArtMethod' appears in /system/framework/core-libart.jar)

La linea che le relazioni StackTrace è:

googleApiClient.connect(); 

Utilizzo dei servizi di gioco 8.1

compile 'com.google.android.gms:play-services:8.1.0' 

qualcuno ha questo questo?

+1

Il file JAR compilato non è la stessa versione del file JAR con cui è stato eseguito. – EJP

+0

grazie. Ho pulito e ricostruito lo stesso. Qualche suggerimento su come assicurarsi che il file jar venga aggiornato? – middlestump

+0

Non ho detto nulla di pulito o di ricostruzione. Nessuno di questi risolverà un problema di versione. Ho lo stesso suggerimento di prima. Come si implementa questa è un'altra domanda. – EJP

risposta

17

Il problema proviene da una delle librerie della tua app dipende da, libreria che dipende anche da Google Play Services.

Questa libreria utilizza una versione precedente dell'SDK di Google Play Services e si basa ancora sul fatto che la classe GoogleApiClient sia un'interfaccia. This has changed in 8.1.0 where it became an abstract class. Questo rompe la compatibilità a ritroso a causa delle dipendenze transitive delle librerie.

Verificare se la libreria che si utilizza ha una nuova versione aggiornata con 8.1.0 o rimuovere tale dipendenza, se possibile.

More explanation can be found here.

8

Questo è un bug nella libreria di servizi di gioco 8.1.0. Risolto risolvendo la libreria dei servizi di gioco.

cambiamento

compile 'com.google.android.gms:play-services:8.1.0' 

a

compile 'com.google.android.gms:play-services:7.8.+' 

e non appare più l'errore. Il mio altro codice ha funzionato (come menzionato nella domanda perché stavano usando la versione precedente della libreria) Ciò dovrà essere fatto fino a quando Google rilascerà un aggiornamento.

Aggiornamento: Ho scritto questo prima che arrivasse l'altra risposta di Galex. Questa è la risposta corretta. Ma se non riesci a trovare le librerie con questi conflitti di versione, o se non riesci a cambiare queste dipendenze della libreria, la soluzione è di eseguire il downgrade della versione di gioco a 7.8

+1

'compile 'com.google.android.gms: play-services: 7.8.0'' funziona. Fai sempre pratica migliore per evitare di usare + se puoi. –

+0

Lo userò da solo, ma sappiamo che questo non è un buon approccio. Resteremo per sempre in 7.8? – sagits

-1
 compile 'com.google.android.gms:play-services:7.8.+' 
compile 'com.google.android.gms:play-services-maps:7.8.+' 

Risolto per me dopo 10+ ore !!

+0

Sarebbe molto meglio se avessi qualche spiegazione sul perché è necessario utilizzare una versione precedente. –

+0

Il mio ragionamento era che una delle mie librerie usava 8.4, un'altra usata 7.8 quindi usando il + indicherei di usare qualsiasi versione fosse necessaria al momento dell'uso .... –

Problemi correlati