API OneDrive после исходного OAuth Android

В настоящее время я использую Android API One Drive, доступный здесь:

https://github.com/OneDrive/onedrive-explorer-android

Я могу успешно выполнить OAuth, чтобы дать разрешения моему приложению.

Однако я не могу использовать API в будущем. Я продолжаю получать ошибки 401 об отказе в разрешении.

    public static final List<String> SCOPES = Arrays.asList("wl.signin", "onedrive.readwrite");


    mAuthClient = new AuthClient(this, OneDriveOAuthConfig.getInstance(), OneDriveController.ONEDRIVE_CLIENT_ID);
    mAuthClient.login(this, OneDriveController.SCOPES, mAuthListener);

Вышеупомянутое работает, но я не могу использовать следующее позже

public void setAuthClient()
{
    if (mAuthClient == null)
    {
        mAuthClient = new AuthClient(getContext(), OneDriveOAuthConfig.getInstance(), ONEDRIVE_CLIENT_ID);
        mAuthClient.initialize(SCOPES, mAuthListener, null, mAccount.getToken());
    }
}

AuthListener mAuthListener = new AuthListener() {
    @Override
    public void onAuthComplete(AuthStatus status, AuthSession session, Object userState) {

    }

    @Override
    public void onAuthError(AuthException exception, Object userState) {
        exception.printStackTrace();

    }
};

/**
 * Get an instance of the OneDrive service
 *
 * @return The OneDrive Service
 */
synchronized IOneDriveService getOneDriveService() {
    if (mODConnection == null) {
        setAuthClient();
        final ODConnection connection = new ODConnection(mAuthClient);
        connection.setVerboseLogcatOutput(true);
        mODConnection = connection.getService();
    }
    return mODConnection;
}

@Override
public double getRemainingSpace() {

    getOneDriveService().getDrive(new Callback<Drive>() {
        @Override
        public void success(Drive drive, Response response) {
            remaining_space = drive.Quota.Remaining.doubleValue();
        }

        @Override
        public void failure(RetrofitError error) {
            error.printStackTrace();
        }
    });

    return remaining_space;

}

Как именно я могу заставить API делать то, что я хочу?

Спасибо,

Парт


person Parth    schedule 06.07.2015    source источник
comment
Вы пытались использовать область wl.offline_access?   -  person m02ph3u5    schedule 09.07.2015
comment
На самом деле, я думаю, это сработало. добавление этого разрешения позволило мне создать токен обновления и использовать его.   -  person Parth    schedule 09.07.2015
comment
Большой! Удачи с вашим приложением.   -  person m02ph3u5    schedule 10.07.2015


Ответы (1)


Я не просматривал ваш код, но вот что работает для меня:

В моей деятельности по настройке:

    AuthClient authClient = AuthClientFactory.getAuthClient(this);
    authClient.login(
        this,
        Arrays.asList("wl.signin", "wl.offline_access", "onedrive.readwrite"),
        new AuthListener() {
            @Override
            public void onAuthComplete(AuthStatus status, AuthSession session, Object userState) {
                Log.d(TAG, "authorized " + status);
                if (status == AuthStatus.CONNECTED) {
                    // you're good
                } else {
                    Log.e(TAG, "bad status " + status.name());
                    // handle error
                }
            }

            @Override
            public void onAuthError(AuthException exception, Object userState) {
                Log.e(TAG, "failed", exception);
                // handle error
            }
        });

Использование/потребление API где-то еще:

    authClient = AuthClientFactory.getAuthClient(context);
    authClient.initialize(new AuthListener() {
        @Override
        public void onAuthComplete(AuthStatus status, AuthSession session, Object userState) {

        }

        @Override
        public void onAuthError(AuthException exception, Object userState) {
            Log.e(TAG, "connect failed", exception);
        }
    });

        final IOneDriveService service = OneDriveServiceFactory.getService(authClient);

        service.yourRetrofitInterfaceFunctionHere(yourParamsHere, new Callback<YourCallbackTypeHere>() {
            @Override
            public void success(Item item, Response response) {
            }

            @Override
            public void failure(RetrofitError error) {
            }
        });

И моя фабрика (вы также можете встроить этот код):

package ****;

import android.content.Context;

import ***.OneDriveOAuthConfig;

public class AuthClientFactory {

    private static AuthClient authClient;

    public static AuthClient getAuthClient(Context context) {
        if (authClient == null)
            authClient = new AuthClient(context, OneDriveOAuthConfig.getInstance(), "YOUR CLIENT ID");
        return authClient;
    }

}
person m02ph3u5    schedule 09.07.2015
comment
Где определен AuthClientFactory? я не могу найти его - person Parth; 09.07.2015
comment
Я все еще получаю ошибку 401 Auth при попытке выполнить основные операции, такие как получение оставшегося места. Кроме того, где я должен использовать свой секрет? - person Parth; 09.07.2015
comment
Мне не нужна была моя тайна... Мне тоже было любопытно. Но у меня едет нормально. Правильно ли настроено ваше приложение (со стороны Microsoft)? Используете ли вы модификацию с okhttp (как в упомянутом примере)? Пожалуйста, покажите мне вызовы API, которые вы делаете, + ваш код авторизации. Какие разрешения вы запрашивали? - person m02ph3u5; 09.07.2015