2015-09-11 3 views
0

Je suis actuellement la mise en œuvre d'un client WebDAV pour Android, qui est basé sur sardine (https://github.com/lookfirst/sardine). L'Android-Client est ciblé pour le niveau d'API 15 (niveau min-Api).Java client sardine webdav sur Android

En ce moment, je veux initialiser la connexion en utilisant la classe Sardine usine comme ceci:

sardine = SardineFactory.begin(user, password); 

Ce morceau de code est intégré dans une activité, qui vérifie si les informations d'identification sont valides. En appuyant sur le bouton OK de l'activité d'un AsyncTask commence qui intègre la ligne de code ci-dessus

AsyncTask<ServerCredentials, Void, ServerCredentials> verifyCredentialsTask = new AsyncTask<String[], Void, boolean>(){ 
      @Override 
      protected boolean doInBackground(String[]...c) { 
       try { 
        String user = c[0]; 
        String password = c[1] 
        sardine = SardineFactory.begin(user, password); 
        return true; 
       } 
       catch (Exception e) { 
        return false; 
       } 

      }; 

      @Override 
      protected void onPostExecute(ServerCredentials sc) { 
       final Intent intent = new Intent(); 
       ... 

       setAccountAuthenticatorResult(intent.getExtras()); 
       setResult(RESULT_OK); 
       finish(); 
      } 
     }; 

Lorsque je déboguer l'application Android, je me lève au point où la sardine est initialzed première du SardineFactory. Si je franchis cette ligne, une erreur ExceptionInInitializerError est levée. Bien, il y a une instruction catch try, l'ensemble des accidents d'activité et la trace d'exception suivante peut être vu dans la fenêtre logcat:

E/AndroidRuntime(10996): FATAL EXCEPTION: AsyncTask #1 
E/AndroidRuntime(10996): java.lang.RuntimeException: An error occured while executing doInBackground() 
E/AndroidRuntime(10996): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
E/AndroidRuntime(10996): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
E/AndroidRuntime(10996): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
E/AndroidRuntime(10996): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
E/AndroidRuntime(10996): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
E/AndroidRuntime(10996): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
E/AndroidRuntime(10996): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
E/AndroidRuntime(10996): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
E/AndroidRuntime(10996): at java.lang.Thread.run(Thread.java:856) 
E/AndroidRuntime(10996): Caused by: java.lang.ExceptionInInitializerError 
E/AndroidRuntime(10996): at com.github.sardine.SardineFactory.begin(SardineFactory.java:45) 
E/AndroidRuntime(10996): at com.github.sardine.SardineFactory.begin(SardineFactory.java:34) 
E/AndroidRuntime(10996): at com.github.sardine.SardineFactory.begin(SardineFactory.java:22) 

Je l'ai déjà cherché sur le web pour une réponse. La définition de ExceptionInInitializerError est générique (https://docs.oracle.com/javase/8/docs/api/index.html?java/lang/ExceptionInInitializerError.html).

Si j'attache la source à mon sardine.jar référencé, je peux déboguer dans les méthodes begin et leurs surcharges. La méthode finale "begin", qui est appelée est définie par

public static Sardine begin(String username, String password, ProxySelector proxy) 
{ 
    try { 
     return new SardineImpl(username, password, proxy); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 

semble causer le problème.

Comme vous pouvez le voir, je l'ai déjà modifié avec un try catch, pour voir si je peux attraper l'exception qui est levée. Mais dès que j'interviens sur le constructeur SardineImpl, l'exception ExceptionInInitializerError est levée. Je n'ai aucune chance de l'attraper.

Je suppose qu'une bibliothèque est toujours manquante. Je construis sardine.jar dans eclipse par un script de build maven (clean install). La source est inchangé sauf que j'ajouté les bibliothèques manquantes suivantes

ant-1.9.2.jar 
commons-codec-1.6.jar 
commons-logging-1.1.3.jar 
httpclient-4.5.jar 
httpcore-4.3.2.jar 
slf4j-api-1.7.12.jar 
slf4j-jdk14-1.7.12.jar 

Les crochets dans les paramètres du projet Eclipse (chemin de génération Java -> Commander et l'exportation) sont fixés pour toutes les bibliothèques externes. Par conséquent, je suppose que rien ne manque, lorsque l'APK est construit et installé sur l'appareil cible.

Est-ce que quelqu'un a rencontré un problème similaire? Comment puis-je interpréter l'exception ExceptionInInitializerError?

Répondre

1

juste pour fermer ce problème. En raison du fait que je voulais accéder à une instance de ownCloud via webdav, j'ai décidé de laisser tomber la bibliothèque de sardines et de choisir la bibliothèque native ownCloud (https://github.com/owncloud/android-library). Cette bibliothèque incluait un très bon exemple de client et fonctionnait parfaitement pour mon projet.

Remerciements

0

J'ai pu résoudre le problème en utilisant la bibliothèque Sardine, qui a été réécrite pour Android en tant que projet Android-Library (https://github.com/aflx/Sardine-Android). J'ai importé le projet dans mon espace de travail Eclipse, je l'ai construit et j'ai lié le fichier jar du sous-répertoire bin à mon projet. Enfin, j'ai dû définir le crochet dans les paramètres du projet "Build Path" -> "Order and Export".

Cette solution a résolu le problème ci-dessus. Maintenant, je suis un peu plus loin, mais toujours obtenir une exception. Lorsque je tente de lister les fichiers et dossiers sur le serveur distant avec la ligne de code suivant

List<DavResource> res = sardine.list(hostName); 

je reçois un NoClassDefFoundError qui me dit qu'il n'a pas pu trouver la org.simpleframework.xml.core.Persister de classe.

E/AndroidRuntime(26434): Caused by: java.lang.NoClassDefFoundError: org.simpleframework.xml.core.Persister 

Dans les paramètres du projet de la Sardine-Android Je lié la

simple-xml-2.6.2.jar 

qui doit contenir la classe manquante. En outre, j'ai lu dans d'autres sites (http://android.phonesdevelopers.com/1011_19444554/), qu'il peut être nécessaire d'exclure les classes du chemin de compilation, car elles peuvent entrer en conflit avec les classes intégrées. Malheureusement, ils travaillent avec Gradle, avec lequel je n'ai pas encore travaillé. Je vais chercher sur le web une solution, mais peut-être quelqu'un sait-il chaud pour faire cela?

0

J'ai des problèmes similaires en essayant de faire fonctionner Sardine sur Android. J'utilise Android Studio, la construction avec SDK 21. J'ai simplement téléchargé les sources Sardine-Android et les a ajoutés au projet dans le dossier /app/src/main/java et simple-xml-2.6.3.jar dans le /app/libs. J'utilise ActionBarActivity. Le code se construit sans erreurs. Je reçois cependant une autre erreur dans la même ligne, mais pas NoClassDefFoundError