0

C'est la bibliothèque que j'utilise: https://github.com/clickntap/VimeoAndroid avec Apache http client bibliothèque android

Je suis en train d'utiliser la bibliothèque pour une application Android. Mon appareil de test est Kitkat (4.4.4).

Voilà ma config gradle:

compileSdkVersion 25 
buildToolsVersion "25.0.3" 
useLibrary 'org.apache.http.legacy' 

defaultConfig { 
    applicationId "my.app.package" 
    minSdkVersion 16 
    targetSdkVersion 25 
    versionCode 1 
    versionName "1.0.0-alpha" 
} 

Voilà comment j'ai ajouté la bibliothèque:

compile 'com.clickntap:vimeo:1.10' 

Mais je reçois l'erreur suivante sur Vimeo.addVideo():

java.lang.NoClassDefFoundError: org.apache.http.impl.client.HttpClientBuilder 

et avertissements:

WARNING: Dependency org.apache.httpcomponents:httpclient:4.3.6 is ignored for debug as it may be conflicting with the internal version provided by Android. 
WARNING: Dependency org.json:json:20140107 is ignored for debug as it may be conflicting with the internal version provided by Android. 

donc j'ai cherché un peu et trouvé que je pouvais faire quelque chose comme ceci:

compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1' 
compile('com.clickntap:vimeo:1.10') { 
    exclude group: 'org.apache.httpcomponents' 
    exclude group: 'org.json' 
} 

Mais maintenant que je reçois cette erreur encore Vimeo.addVideo() et ne peut pas trouver une solution:

java.lang.NoSuchMethodError: org.apache.http.entity.FileEntity.<init> 

S'il vous plaît aider :(

Merci,

PS est ici la trace de la pile pour le 1er scénario:

Caused by: java.lang.NoClassDefFoundError: org.apache.http.impl.client.HttpClientBuilder 
       at com.clickntap.vimeo.Vimeo.apiRequest(Vimeo.java:218) 
       at com.clickntap.vimeo.Vimeo.beginUploadVideo(Vimeo.java:122) 
       at com.clickntap.vimeo.Vimeo.addVideo(Vimeo.java:138) 
       at my.app.package.VimeoActivity$6.subscribe(VimeoActivity.java:163) // my activity 
       at io.reactivex.internal.operators.single.SingleCreate.subscribeActual(SingleCreate.java:39) 
       at io.reactivex.Single.subscribe(Single.java:2702) 
       at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89) 
       at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:451) 
       at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61) 
       at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)  
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)  
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)  
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)  
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
       at java.lang.Thread.run(Thread.java:841)  

Et voici pour le 2ème scénario, où le httpclient-android est inclus:

Caused by: java.lang.NoSuchMethodError: org.apache.http.entity.FileEntity.<init> 
       at com.clickntap.vimeo.Vimeo.apiRequest(Vimeo.java:247) 
       at com.clickntap.vimeo.Vimeo.uploadVideo(Vimeo.java:126) 
       at com.clickntap.vimeo.Vimeo.addVideo(Vimeo.java:140) 
       at my.app.package.VimeoActivity$6.subscribe(VimeoActivity.java:163) // my activity 
       at io.reactivex.internal.operators.single.SingleCreate.subscribeActual(SingleCreate.java:39) 
       at io.reactivex.Single.subscribe(Single.java:2702) 
       at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89) 
       at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:451) 
       at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61) 
       at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)  
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)  
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)  
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)  
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
       at java.lang.Thread.run(Thread.java:841)  
+0

Vérifiez la section 'Apache HTTP Client Removal' sur cette page https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html. Je suppose que ça va aider cette situation. – shiftpsh

+0

avez-vous le choix dans les bibliothèques? Je n'utiliserais pas cette librairie uniquement parce qu'elle ne me permet pas d'échanger le httpclient sous-jacent (ça vous oblige à utiliser apache ... d'où votre problème) – Jon

+0

merci, j'ai fini par créer ma propre bibliothèque de téléchargement Android après le vimeo api spécifications – Mon

Répondre

1

version Android < 6 intégré une fourchette de client HTTP Apache 4.0. instantané bêta (https://hc.apache.org/httpcomponents-client-4.3.x/android-port.html).

Le 1er scénario échoue car HttpClientBuilder a été introduit sur httpclient: 4.3.

Le deuxième scénario échoue car vous utilisez à la fois useLibrary 'org.apache.http.legacy' qui charge la bibliothèque httpclient héritée et compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'. Le client Vimeo utilise un constructeur FileEntity qui n'existait pas dans la bibliothèque héritée, qui existe dans le classpath et a la priorité sur la version httpclient-android de la classe FileEntity.

Je suggère d'utiliser les dépendances comme dans le 2e scénario, mais retirez useLibrary 'org.apache.http.legacy'. Cette solution fonctionnera avec n'importe quelle dépendance sur httpcomponents:httpclient si vous utilisez des API qui ont été introduites avant ou en 4.3.5.1 et plus tard, en supposant que l'API publique de la bibliothèque httpclient-android soit identique à httpcomponents: bibliothèque httpclient de la même version.

Mise à jour

Cette solution ne fonctionnera pas si votre code ou vos dépendances utilisent une API explicitement qui a été remplacé dans la bibliothèque httpclient-android afin de ne pas entrer en conflit avec l'héritage version httpclient du SDK Android. org.apache.httpcomponents: httpclient fournit des constructeurs (par exemple HttpClientBuilder, EntityBuilder, MultipartEntityBuilder) qui résument les classes réellement utilisées, ce qui devrait être préféré. Malheureusement, l'accès à la fois aux classes/API "internes" et à l'utilisation de Builders est possible (probablement pour maintenir la compatibilité), mais je crois que la bibliothèque devrait autoriser une méthode propre.

Dans l'exemple ci-dessus, la bibliothèque Vimeo utilise directement le constructeur FileEntity, qui couple la bibliothèque avec une classe spécifique, alors que cela pourrait être découplée, si le EntityBuilder a été utilisé. Donc, la seule façon dont je peux voir, est de modifier le code source de la bibliothèque, pour le rendre compatible avec la bibliothèque httpclient-android et Android en général.

+0

Salut, merci pour votre aide. J'ai essayé cela mais j'ai quand même obtenu le 'Causé par: java.lang.NoSuchMethodError: org.apache.http.entity.FileEntity. 'erreur – Mon

+0

Salut, merci pour les commentaires. Veuillez vérifier la réponse mise à jour. –

+0

merci beaucoup pour les explications! Je vois, j'ai fini par créer ma propre bibliothèque de téléchargement android suivant les spécifications de vimeo api – Mon