我正在使用this sample浏览保管箱帐户,我想添加一项功能,以提供退出当前用户并登录新帐户的选项。为此,我发现我可以使用dbxClientV2.auth().tokenRevoke()
所以我将DropboxClientFactory更改为;
public class DropboxClientFactory {
private static DbxClientV2 sDbxClient;
public static void init(String accessToken) {
if (sDbxClient == null) {
DbxRequestConfig requestConfig = DbxRequestConfig.newBuilder("examples-v2-demo")
.withHttpRequestor(OkHttp3Requestor.INSTANCE)
.build();
sDbxClient = new DbxClientV2(requestConfig, accessToken);
}
}
public static DbxClientV2 getClient() {
if (sDbxClient == null) {
throw new IllegalStateException("Client not initialized.");
}
return sDbxClient;
}
public static void revokeClient(final CallBack callBack) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
sDbxClient.auth().tokenRevoke();
} catch (DbxException e) {
Log.e("Dropbox", "Access Revoke Exception", e);
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
sDbxClient = null;
if (callBack != null)
callBack.onRevoke();
}
}.execute();
}
public interface CallBack{
void onRevoke();
}
}
在DropboxActivity中添加了revokeToken
函数。整个修改DropboxActivity
如下
public abstract class DropboxActivity extends AppCompatActivity {
@Override
protected void onResume() {
super.onResume();
SharedPreferences prefs = getSharedPreferences("dropbox-sample", MODE_PRIVATE);
String accessToken = prefs.getString("access-token", null);
if (accessToken == null) {
accessToken = Auth.getOAuth2Token();
if (accessToken != null) {
prefs.edit().putString("access-token", accessToken).apply();
initAndLoadData(accessToken);
}
} else {
initAndLoadData(accessToken);
}
}
private void initAndLoadData(String accessToken) {
DropboxClientFactory.init(accessToken);
PicassoClient.init(getApplicationContext(), DropboxClientFactory.getClient());
loadData();
}
protected abstract void loadData();
protected boolean hasToken() {
SharedPreferences prefs = getSharedPreferences("dropbox-sample", MODE_PRIVATE);
String accessToken = prefs.getString("access-token", null);
return accessToken != null;
}
protected void removeToken(DropboxClientFactory.CallBack callback) {
SharedPreferences prefs = getSharedPreferences("dropbox-sample", MODE_PRIVATE);
prefs.edit().remove("access-token").apply();
DropboxClientFactory.revokeClient(callback);
}
}
所以在退出时我打电话
removeToken(new DropboxClientFactory.CallBack() {
@Override
public void onRevoke() {
onResume();
}
});
当我们没有在应用的当前会话中登录时,这可以正常工作。但是,如果我登录并从应用程序的同一会话生成令牌,并在稍后撤消该令牌,Auth.getOAuth2Token()
仍会返回之前被撤销的令牌,无论我们稍后从其他帐户登录多少次。此应用程序的同一会话中的此登录令牌也无法从Auth
课程中删除。如何解决这个问题?有更好的方法吗?
答案 0 :(得分:1)
我遇到了同样的问题。
我解决了它在DropboxActivity文件上将静态AuthActivity.result变量设置为null:
protected void removeToken(DropboxClientFactory.CallBack callback) {
SharedPreferences prefs = getSharedPreferences("dropbox-sample", MODE_PRIVATE);
prefs.edit().remove("access-token").apply();
com.dropbox.core.android.AuthActivity.result = null;//FIX
DropboxClientFactory.revokeClient(callback);
}
它有效!
您将成功注销。
为什么?
Auth.getOAuth2Token()方法返回Login Activity的结果,即使你已经注销它(DropboxClientFactory.revokeClient(callback))。一个选项是将该变量设置为null。