Android Dropbox API v2,验证后尝试加载文件时出现InvalidAccessTokenException

Android Dropbox API v2,验证后尝试加载文件时出现InvalidAccessTokenException,android,dropbox-api,Android,Dropbox Api,我在尝试将文件上载到Dropbox时遇到InvalidAccessTokenException 对于授权,我使用下一个算法: Auth.startOAuth2Authentication(context, APP_KEY); //granting access //previous activity is reopened String accessToken = Auth.getOAuth2Token(); DbxRequestConfig requestConfig = DbxReque

我在尝试将文件上载到Dropbox时遇到InvalidAccessTokenException

对于授权,我使用下一个算法:

Auth.startOAuth2Authentication(context, APP_KEY);

//granting access
//previous activity is reopened

String accessToken = Auth.getOAuth2Token();
DbxRequestConfig requestConfig = DbxRequestConfig.newBuilder(CLIENT_ID)
                    .withHttpRequestor(OkHttp3Requestor.INSTANCE)
                    .build();
DbxClientV2 client = new DbxClientV2(requestConfig, accessToken);
client.files().uploadBuilder(ADDRESS_IN_DROPBOX)
                            .uploadAndFinish(inputStream);
返回InvalidAccessTokenException

也许我做错了什么

也可能Auth.getOAuth2Token()返回Auth代码而不是访问代码(从方法名来看这有点明显),但是在已知Auth代码的情况下如何获取访问代码呢

PS我使用了Android项目作为示例,并执行了与示例中完全相同的auth

编辑-----------------------------------------------------------------------------------------------

只有在从Dropbox网页的帐户设置中取消对应用程序的访问后,问题才会出现。

您注意到:

只有在从Dropbox网页的帐户设置中取消对应用程序的访问后,问题才会发生

在这种情况下,这是意料之中的。如果用户撤销令牌(例如通过断开应用程序的链接),则使用该令牌尝试的任何进一步API调用都将失败,并出现此异常。您应该让代码捕获此异常,并提示用户如果想继续使用,请重新链接应用程序。

您注意到:

只有在从Dropbox网页的帐户设置中取消对应用程序的访问后,问题才会发生


在这种情况下,这是意料之中的。如果用户撤销令牌(例如通过断开应用程序的链接),则使用该令牌尝试的任何进一步API调用都将失败,并出现此异常。您应该让代码捕获此异常,并提示用户如果想继续使用应用程序,请重新链接该应用程序。

我在代码中发现问题。 我在Dropbox中使用了DropboxClientFactory,其中客户端init如下所示

public static void init(String accessToken) {
    if (sDbxClient == null)) {
        DbxRequestConfig requestConfig = DbxRequestConfig.newBuilder("ID")
                .withHttpRequestor(OkHttp3Requestor.INSTANCE)
                .build();

        sDbxClient = new DbxClientV2(requestConfig, accessToken);

    }
}
public static void init(String accessToken) {
        if (sDbxClient == null || !accessToken.equals(accessCode)) {
            DbxRequestConfig requestConfig = DbxRequestConfig.newBuilder("ID")
                    .withHttpRequestor(OkHttp3Requestor.INSTANCE)
                    .build();

            sDbxClient = new DbxClientV2(requestConfig, accessToken);

        }
    }
当撤销访问令牌时,由于sDbxClient已初始化,所以未调用初始化进程

所以我向DropboxClientFactory添加了变量accessCode来保存使用过的访问令牌,现在init看起来像这样

public static void init(String accessToken) {
    if (sDbxClient == null)) {
        DbxRequestConfig requestConfig = DbxRequestConfig.newBuilder("ID")
                .withHttpRequestor(OkHttp3Requestor.INSTANCE)
                .build();

        sDbxClient = new DbxClientV2(requestConfig, accessToken);

    }
}
public static void init(String accessToken) {
        if (sDbxClient == null || !accessToken.equals(accessCode)) {
            DbxRequestConfig requestConfig = DbxRequestConfig.newBuilder("ID")
                    .withHttpRequestor(OkHttp3Requestor.INSTANCE)
                    .build();

            sDbxClient = new DbxClientV2(requestConfig, accessToken);

        }
    }

我发现我的代码有问题。 我在Dropbox中使用了DropboxClientFactory,其中客户端init如下所示

public static void init(String accessToken) {
    if (sDbxClient == null)) {
        DbxRequestConfig requestConfig = DbxRequestConfig.newBuilder("ID")
                .withHttpRequestor(OkHttp3Requestor.INSTANCE)
                .build();

        sDbxClient = new DbxClientV2(requestConfig, accessToken);

    }
}
public static void init(String accessToken) {
        if (sDbxClient == null || !accessToken.equals(accessCode)) {
            DbxRequestConfig requestConfig = DbxRequestConfig.newBuilder("ID")
                    .withHttpRequestor(OkHttp3Requestor.INSTANCE)
                    .build();

            sDbxClient = new DbxClientV2(requestConfig, accessToken);

        }
    }
当撤销访问令牌时,由于sDbxClient已初始化,所以未调用初始化进程

所以我向DropboxClientFactory添加了变量accessCode来保存使用过的访问令牌,现在init看起来像这样

public static void init(String accessToken) {
    if (sDbxClient == null)) {
        DbxRequestConfig requestConfig = DbxRequestConfig.newBuilder("ID")
                .withHttpRequestor(OkHttp3Requestor.INSTANCE)
                .build();

        sDbxClient = new DbxClientV2(requestConfig, accessToken);

    }
}
public static void init(String accessToken) {
        if (sDbxClient == null || !accessToken.equals(accessCode)) {
            DbxRequestConfig requestConfig = DbxRequestConfig.newBuilder("ID")
                    .withHttpRequestor(OkHttp3Requestor.INSTANCE)
                    .build();

            sDbxClient = new DbxClientV2(requestConfig, accessToken);

        }
    }

我已经这样做了。捕获异常并再次启动授权过程。但在尝试在授权后立即上载文件之后,出现了另一个InvalidAccessTokenException。我已经这样做了。捕获异常并再次启动授权过程。但在尝试在授权后立即上载文件之后,还有另一个InvalidAccessTokenException。