我有一个独立的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;
}
});