HOST_NOT_AVAILABLE на owncloud-android - библиотека - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть приложение, которое я разрабатывал с Eclipse и ANT, и сейчас я пытаюсь обновить проект до Android Studio (AS) и Gradle.Приложение использует библиотеку ownCloud-android-для загрузки и выгрузки файлов из экземпляра ownCloud или Nextcloud.

Перед обновлением я использовал устаревшую версию ownCloud-Android-Library, которую я хотел бы обновить в процессе миграции.Я поместил ссылку на последнюю ownCloud-Android-библиотеку в мой файл Gradle

dependencies {
    implementation 'com.github.owncloud:android-library:oc-android-library-0.9.22'
}

вместе с

allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}

После успешной сборки приложения я протестировалон находился в эмуляторе и обнаружил проблему при выполнении операции ReadRemoteFolderOperation () на любом из моих тестовых экземпляров (которыми являются ownCloud и сервер Nextcloud).

Непосредственный результат после перехода через операцию ReadRemoteFolderOperation - "HOST_NOT_AVAILABLE".Когда я открываю браузер на эмуляторе и просматриваю первую страницу моего экземпляра ownCloud, он работает - я также могу войти в систему.

Когда я смотрю в logcat, я могу наблюдать следующие два исключения:

E/ReadRemoteFolderOperation: Synchronized /: Unexpected exception
java.lang.IllegalArgumentException: account is null
    at android.accounts.AccountManager.getUserData(AccountManager.java:507)
    at com.owncloud.android.lib.common.accounts.AccountUtils.getUserId(AccountUtils.java:198)
    at com.owncloud.android.lib.common.OwnCloudClient.getUserFilesWebDavUri(OwnCloudClient.java:262)
    at com.owncloud.android.lib.resources.files.ReadRemoteFolderOperation.run(ReadRemoteFolderOperation.java:79)
    at com.owncloud.android.lib.common.operations.RemoteOperation.runOperation(RemoteOperation.java:252)
    at com.owncloud.android.lib.common.operations.RemoteOperation.execute(RemoteOperation.java:215)

com.owncloud.android.lib.common.http.HttpClient: Could not setup SSL system.
java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getFilesDir()' on a null object reference
    at com.owncloud.android.lib.common.network.NetworkUtils.getKnownServersStore(NetworkUtils.java:89)
    at com.owncloud.android.lib.common.http.HttpClient.getOkHttpClient(HttpClient.java:78)
    at com.owncloud.android.lib.common.http.methods.HttpBaseMethod.<init>(HttpBaseMethod.java:58)
    at com.owncloud.android.lib.common.http.methods.webdav.DavMethod.<init>(DavMethod.java:51)
    at com.owncloud.android.lib.common.http.methods.webdav.PropfindMethod.<init>(PropfindMethod.java:52)
    at com.owncloud.android.lib.resources.files.ReadRemoteFolderOperation.run(ReadRemoteFolderOperation.java:81)
    at com.owncloud.android.lib.common.operations.RemoteOperation.runOperation(RemoteOperation.java:252)
    at com.owncloud.android.lib.common.operations.RemoteOperation.execute(RemoteOperation.java:215)

Я не могу понять из этого исключения.

Вот как я запускаю 1-й вариант:

ReadRemoteFolderOperation readRemoteFolder = new ReadRemoteFolderOperation(folderInCloud);
    RemoteOperationResult readRemoteFolderResult = readRemoteFolder.execute(ocClient);
    ResultCode resultCode = readRemoteFolderResult.getCode();

Вот как я запускаю 2-й вариант:

ReadRemoteFolderOperation readOperation = new ReadRemoteFolderOperation(FileUtils.PATH_SEPARATOR);
RemoteOperationResult result = new RemoteOperationResult(ResultCode.UNKNOWN_ERROR);
result = readOperation.execute(ownCloudClient);

Вот как настраивается мой экземпляр ownCloudClient:

ocClient = new OwnCloudClient(serverCredentials.getHostUri());
ocClient.setFollowRedirects(true);
// the out commente lines below were shown in the sample_client, 
// but it doesn't seem to work either
//      ocClient.setCredentials(
//              OwnCloudCredentialsFactory.newBasicCredentials(
//                      serverCredentials.getUsername(),
//                      serverCredentials.getPassword()
//              ));
ocClient.setBaseUri(serverCredentials.getHostUri());
OwnCloudAccount ocAccount = new OwnCloudAccount(serverCredentials.getHostUri(), serverCredentials);
ocClient.setAccount(ocAccount);

serverCredentials - это класс, производный от OwncloudCredentials.Единственный метод, который я переопределяю, - это метод applyTo.Вот как это выглядит:

@Override
public void applyTo(OwnCloudClient ownCloudClient) {
    // this is old code from the pre AS gradle era. 
    // The methods getParams() and getState weren't available on the new library anymore
    //      List<String> authPrefs = new ArrayList<String>(1);
    //        authPrefs.add(AuthPolicy.BASIC);
    //        ownCloudClient.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY, authPrefs);        
    //        
    //        ownCloudClient.getParams().setAuthenticationPreemptive(true);
    //        ownCloudClient.getState().setCredentials(AuthScope.ANY,
    //              new UsernamePasswordCredentials(userName, password)
    //      );

    // Clear previous basic credentials
    HttpClient.deleteHeaderForAllRequests(HttpConstants.AUTHORIZATION_HEADER);
    HttpClient.deleteHeaderForAllRequests(HttpConstants.COOKIE_HEADER);

    HttpClient.addHeaderForAllRequests(HttpConstants.AUTHORIZATION_HEADER,
            Credentials.basic(userName, password));

    Uri baseUri = this.getHostUri();

    OwnCloudAccount ocAccount = new OwnCloudAccount(baseUri, this);
    ownCloudClient.setAccount(ocAccount);
    ownCloudClient.setBaseUri(baseUri);
}

Из трассировки стека первого исключения я бы предположил, что мне нужен работающий аккаунт ownCloud на моем мобильном / эмуляторе (что для меня не имеет смысла)).Я установил официальное приложение ownCloud, которое работало нормально.

У кого-нибудь есть идеи, в чем может быть проблема?

Заранее спасибо,

Майкл

...