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?