Android上的Java沙丁鱼webdav客户端

时间:2015-09-11 17:00:49

标签: java android webdav sardine

我目前正在为Android实施一个基于沙丁鱼(https://github.com/lookfirst/sardine)的WebDAV客户端。 Android-Client针对API级别15(min-Api级别)。

现在我想通过使用Sardine Factory类来初始化连接:

sardine = SardineFactory.begin(user, password);

这段代码嵌入在Activity中,用于检查凭据是否有效。按下Activity的OK按钮,启动AsyncTask,嵌入代码行

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();
            }
        };

当我调试Android应用程序时,我开始从SardineFactory首先初始化沙丁鱼。如果我跨过这一行,则抛出ExceptionInInitializerError。虽然有一个try catch语句,整个活动崩溃,并且可以在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)

我已经在网上搜索了答案。 ExceptionInInitializerError的定义是泛型(https://docs.oracle.com/javase/8/docs/api/index.html?java/lang/ExceptionInInitializerError.html)。

如果我将源附加到我引用的sardine.jar,我可以调试begin方法及其重载。决赛&#34;开始&#34;方法,被调用由

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

似乎导致了这个问题。

正如您所看到的,我已经使用try catch修改了它,看看是否可以捕获抛出的异常。但是当我跨过SardineImpl构造器时,抛出ExceptionInInitializerError。我没有机会抓住它。

我认为,某些图书馆仍然缺失。我通过maven构建脚本(干净安装)在eclipse中构建sardine.jar。除了我添加了以下缺少的库

之外,源代码保持不变
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

为所有外部库设置Eclipse项目设置(Java Build Path - &gt; Order and Export)中的钩子。因此,当构建并安装在目标设备上时,我假设没有遗漏任何内容。

有没有人遇到过类似的问题?如何解释ExceptionInInitializerError异常?

3 个答案:

答案 0 :(得分:1)

只是为了解决这个问题。由于这个事实,我想通过webdav访问ownCloud实例,我决定放弃沙丁鱼库并转到原生的ownCloud库(https://github.com/owncloud/android-library)。这个库包含了一个非常好的样本客户端,并且非常适合我的项目。

由于

答案 1 :(得分:0)

我能够通过使用沙丁鱼库来解决这个问题,沙丁鱼库是为Android重新编写的Android-Library项目(https://github.com/aflx/Sardine-Android)。 我将项目导入Eclipse Workspace,构建它并将bin子目录中的jar文件链接到我的项目中。最后,我不得不在项目的设置中设置钩子&#34; Build Path&#34; - &GT; &#34;订购和出口&#34;。

此解决方案解决了上述问题。现在,我更进了一步,但仍然有例外。当我尝试使用以下代码行列出远程服务器上的文件和文件夹时

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

我得到一个NoClassDefFoundError,它告诉我他找不到类org.simpleframework.xml.core.Persister。

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

在Sardine-Android的项目设置中,我已经链接了

simple-xml-2.6.2.jar

应该包含缺少的类。 此外,我在其他站点(http://android.phonesdevelopers.com/1011_19444554/)中读过,可能有必要从构建路径中排除类,因为它们可能与类中的构建冲突。不幸的是,他们正在使用gradle,我还没有合作过。 我会在网上搜索解决方案,但也许有人知道这样做很热吗?

答案 2 :(得分:0)

我在尝试让沙丁鱼在Android上工作时遇到了类似的问题。我使用的是Android Studio,使用SDK 21构建。我只是下载了Sardine-Android源,并将它们添加到/app/src/main/javasimple-xml-2.6.3.jar/app/libs文件夹中的项目中。我正在使用ActionBarActivity。代码构建没有错误。 然而,我在同一行中收到另一个错误,但不是NoClassDefFoundError