如何从应用中断开一个保管箱帐户?

时间:2016-12-09 05:29:22

标签: android dropbox-api

我正在使用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课程中删除。如何解决这个问题?有更好的方法吗?

1 个答案:

答案 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。