У меня есть приложение, которое я разрабатывал с 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, которое работало нормально.
У кого-нибудь есть идеи, в чем может быть проблема?
Заранее спасибо,
Майкл