我有一个独立的Java应用程序,它使用在github上找到的OneDrive Java API。一切正常。

所以我已经有了一个clientid,一个客户机密,一个授权代码和一个刷新令牌,它们可以完美地工作

现在我想切换到Android,但是使用相同的Java API并没有成功。这就是为什么我要转到由Microsoft提供的官方OneDrive Android SDK。

那里的一切似乎都不同。我使用已知的clientid尝试了以下操作

    final Activity me = this;

    final MSAAuthenticator msaAuthenticator = new MSAAuthenticator() {
        @Override
        public String getClientId() {
            return clientid;
        }

        @Override
        public String[] getScopes() {
            return new String[] { "onedrive.appfolder" };
        }
    };

    final IClientConfig oneDriveConfig = DefaultClientConfig.createWithAuthenticator(
            msaAuthenticator);

    final IOneDriveClient oneDriveClient = new OneDriveClient.Builder()
            .fromConfig(oneDriveConfig)
            .loginAndBuildClient(me);

    oneDriveClient
            .getDrive()
            .buildRequest()
            .get(new ICallback<Drive>() {
                @Override
                public void success(final Drive result) {
                    final String msg = "Found Drive " + result.id;
                    Toast.makeText(me, msg, Toast.LENGTH_SHORT)
                            .show();
                }

                @Override
                public void failure(ClientException ex) {
                    final String msg = "Error";
                    Toast.makeText(me, msg, Toast.LENGTH_SHORT)
                            .show();
                }
            });


在执行.loginAndBuildClient(me)行时,它最终陷入一个看似永无休止的循环中

在logcat中,我看到它抑制了一个异常

07-13 12:32:17.082 28175-28271/org.xxxxxxx.xxxxxxxxx E/MSAAuthenticator$5[onAuthComplete] - 314:

Failed silent login, interactive login required

    com.onedrive.sdk.authentication.ClientAuthenticatorException: Failed silent login, interactive login required
        at com.onedrive.sdk.authentication.MSAAuthenticator$5.onAuthComplete(MSAAuthenticator.java:312)


还有一些信息消息:

07-13 12:32:17.079 28175-28271/org.xxxxxxx.xxxxxxxxx I/LiveAuthClient:
   No refresh token available, sorry!
07-13 12:32:17.079 28175-28271/org.xxxxxxx.xxxxxxxxx I/LiveAuthClient:
   All tokens expired, you need to call login() to initiate interactive logon


显然,它以某种方式想要执行交互式登录,但失败极了。

我不明白的是:我已经有一个完全有效的刷新令牌,可以重用,但是在MS OneDrive SDK中没有找到一种方法来做到这一点。

有人可以帮我吗?

最佳答案

这篇文章有点老,但我想分享我的解决方案来帮助他人。

而不是仅使用Activity参数使用此方法“ loginAndBuildClient”,如下所示:

final IOneDriveClient oneDriveClient = new OneDriveClient.Builder()
        .fromConfig(oneDriveConfig)
        .loginAndBuildClient(me);


声明一个全局的OneDriveClient:

private IOneDriveClient mOneDriveClient;


然后,将“ loginAndBuildClient”方法与Callback参数一起使用。并以“成功”方法分配您的OneDriveClient:

new OneDriveClient.Builder()
                .fromConfig(DefaultClientConfig.createWithAuthenticator(msaAuthenticator))
                .loginAndBuildClient(MainActivity.this, new ICallback<IOneDriveClient>() {
                    @Override
                    public void success(IOneDriveClient iOneDriveClient) {
                        mOneDriveClient = iOneDriveClient;
                    }

                    @Override
                    public void failure(ClientException ex) {
                        mOneDriveClient = null;
                    }
                });

09-27 12:59