gpt4 book ai didi

android - 如何从应用程序断开一个保管箱帐户?

转载 作者:行者123 更新时间:2023-11-29 01:13:56 27 4
gpt4 key购买 nike

我正在使用 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();
}
});

当我们没有在应用程序的当前 session 中登录时,这工作正常。但是,如果我登录并从应用程序的同一 session 生成 token ,并在稍后撤销该 token ,Auth.getOAuth2Token() 仍会返回之前撤销的 token ,无论我们有多少次以后从另一个帐户登录。在应用程序的同一 session 中登录的 token 也不能从 Auth 类中删除。如何解决这个问题?有更好的方法吗?

最佳答案

我遇到了同样的问题。

我解决了在 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() 方法返回登录 Activity 的结果,即使您已注销它 (DropboxClientFactory.revokeClient(callback))。一个选项是将该变量设置为空。

关于android - 如何从应用程序断开一个保管箱帐户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41053675/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com