Android 应用程序:获取 Google Drive API 的访问令牌

2023-12-23

我正在编写一个 Android(ICS 版本)应用程序。它将数据上传到 Google Drive。该应用程序 使用 oauth2 获取访问令牌。

第一步:获取授权令牌。

    String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/drive";
    // Step 1
    accountManager.getAuthToken(
        account,                                // Account retrieved using getAccountsByType("com.google")
        AUTH_TOKEN_TYPE,                        // Auth Token Type
        options,                                // Authenticator-specific options
        this,                                   // Your activity
        new OnTokenAcquired(),                  // Callback called when a token is successfully acquired
        new Handler(new OnAuthTokenError()));   // Callback called if an error occurs
}
private class OnTokenAcquired implements AccountManagerCallback<Bundle> {
    @Override
    public void run(AccountManagerFuture<Bundle> result) {
        // Get the result of the operation from the AccountManagerFuture.
        Bundle bundle;
        try {
            bundle = result.getResult();

            authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);

            Log.d(TAG,"authToken:" + authToken);

            exchangeToken access = (exchangeToken) new exchangeToken().execute();

        } catch (OperationCanceledException e) {
            e.printStackTrace();
        } catch (AuthenticatorException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
} 

成功。获取授权令牌。

步骤 2:将授权令牌交换为访问令牌。

    private class exchangeToken extends AsyncTask<String, Void, Void> {

    @Override
    protected Void doInBackground(String... params) {
        HttpTransport transport = new NetHttpTransport();
        JsonFactory jsonFactory = new GsonFactory();
        String CLIENT_ID = "999999999999.apps.googleusercontent.com";
        String CLIENT_SECRET = "axXXXXXXXXXXXXXXX7";

        try { // Step 2: Exchange for an access and refresh token
            GoogleTokenResponse authResponse = new GoogleAuthorizationCodeTokenRequest(transport, jsonFactory, CLIENT_ID, CLIENT_SECRET, authToken, CALLBACK_URL).execute();
            accessToken = authResponse.getAccessToken();
            Log.d("Get Access","Token:" + accessToken);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}  

失败。 LogCat 显示以下内容: com.google.api.client.auth.oauth2.TokenResponseException:400错误请求

{

 "error":"unauthorized_client"

}

我已经能够使用“云端硬盘”应用程序在 Android 平板电脑上访问“Google 云端硬盘”。所以 我的电子邮件帐户有效。可能是 AUTH_TOKEN_TYPE 不正确,但 Google 云端硬盘 SDK不清楚它一定是什么。我缺少什么?


您不需要执行第二步交换令牌。 Android 会直接授予您访问令牌,但不会授予您必须用其来交换令牌的授权码。

这一页 http://developer.android.com/training/id-auth/authenticate.htmlAndroid 文档很好地解释了一切。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 应用程序:获取 Google Drive API 的访问令牌 的相关文章

随机推荐

  • Angular - 多个条件 http 请求

    我正在努力想出一个基于每个请求的结果来执行多个 http 请求的良好解决方案 到目前为止 我用 switchMap 做得很好 只要它只有 2 个 http 请求 但是 我发现我需要执行 3 并且我不确定如何使用 switchMap 来执行此
  • 为什么建议在 Python 中派生自 Exception 而不是 BaseException 类?

    The Python 2 文档 https docs python org 2 library exceptions html module exceptions说 鼓励程序员从 Exception 类或其子类之一派生新异常 而不是从 Ba
  • 在 Swift 中获取标头响应

    我正在按照这个答案在我的 swift 项目中进行 HTTP 调用 如何在 Swift 中发出 HTTP 请求 https stackoverflow com questions 24016142 how to make an http re
  • 将元素插入已排序的列表中

    好吧 我正在使用 getSharedPreferences 来存储我的高分 但在填充它之前 我想通过数组将分数按升序排序 但如果它在第一个 pos 中发现分数小于它 那么它不会检查其余部分最小的 function to add score
  • RTL 支持:仅对特定 UI 组件禁用它

    我有一个自定义视频播放器活动 我被迫在我的应用程序中启用 RTL 支持 但这样做会导致进度条从右到左对齐 而且看起来很丑 我希望我的 ProgressBar 在启用 RTL 的应用程序中保持 LTR 有什么解决办法吗 附 我使用的是安卓4
  • Mybatis foreach集合是map-parameter中的列表

    我使用的是mybatis 3 2 8版本 映射器 java List
  • 有什么方法可以将视图稍微放在其父布局之外吗?

    这是一个关于Android布局的问题 这就是我的eagerly想要得到 深灰色是LinearLayout 橙色是布局 X 绿色是 FrameLayout 我需要将 Green 放在其父布局 X 之外 所描述的布局层次结构无法更改 唯一的选择
  • 结合 Google Analytics 客户端和服务器端跟踪

    我使用 Google Analytics 客户端跟踪用户行为 在某些时候 用户会被重定向到我的合作伙伴之一 我会收到该合作伙伴关于用户生成的价值的回调 问题是 如何将回调中的值作为目标附加到用户会话中 目标是能够深入了解哪些流量来源产生最大
  • ng如果设置颜色?

    我有这个 json nodename Main application Server enabled true nodename Main Server enabled false 我用 ngFor 在我的模板中显示这些数据 div cla
  • 检查正在运行的进程正在做什么:打印未检测的 Python 程序的堆栈跟踪

    Linux 上有没有办法检查正在运行的 Python 守护进程正在做什么 也就是说 不检测代码也不终止它 最好我想获取模块的名称以及当前正在运行的模块的行号 strace pstack 和 gdb 等传统调试工具对于 Python 代码来说
  • 在nodejs中保存从url保存的图像时出现问题

    我试图scrape网站数据同时scraping从我的服务器目录打开图像时 我收到类似文件 加载图像时发生错误 的错误 图像以扩展名存储 但图像无法正确打开 var request require request var cheerio re
  • C++11 中 2D 向量构造的重大变化是什么?

    在阅读答案时MS Connect 网站上的一个问题 http connect microsoft com VisualStudio feedback details 691756 std make pair error in vc11我注意
  • 如何使用lua设置bash环境变量

    我对 lua 脚本功能很陌生 我尝试使用 os execute 导出 MY VAR 10 io popen 导出 MY VAR 10 来自lua脚本 我尝试在执行 lua 脚本后使用 echo MY VAR 从 shell 读取 MY VA
  • 检查一个列表中的任何元素是否在另一个列表中[重复]

    这个问题在这里已经有答案了 我正在尝试比较两个列表 如果第一个列表中的任何值在第二个列表中 则简单地打印一条消息 def listCompare list1 1 2 3 4 5 list2 5 6 7 8 9 if list1 in lis
  • 缺少样式。是否为此布局选择了正确的主题?

    缺少样式 是否为此布局选择了正确的主题 使用布局上方的主题组合框选择不同的布局 或修复主题样式参考 找不到款式mapViewStyle在当前主题中 我尝试了所有可用的解决方案来解决这个问题 但似乎没有任何效果 我已将库包含在清单文件中 我什
  • Sql Server:当“强制外键约束”设置为“否”时,使用它有什么好处?

    我知道 RDBMS 中 强制外键约束 的目的 但是设置为 NO 有什么好处吗 在正常生产中 此设置应该never被设置为NO 但是 当您开发或重组数据库时 或者当您执行诸如以下操作时 您需要 清理 清理 大量数据 那么关闭外键约束以允许将
  • 主从视图 ASP.NET MVC

    我是 MVC 新手 参与了一个使用 ASP NET MVC 1 0 开发的项目 我的 JavaScript 也很弱 我试图演示主详细信息视图如何在 Northwind 数据库中的 订单 和 订单详细信息 表上工作 因此 表之间存在关系 即一
  • 如何找到多维数组中最长的字符串?

    我试图从多维数组中获取最长的字符串 但由于某种原因它不起作用 这就是我所拥有的 a MAKKGKPRPDHRPPAHNPHYAHDPPPYSQQQPPLQQQNYAQQMNRQHARPRPSPPSEVSDCVKYSLFLYNCIFWVSMH
  • InputBindings 仅在聚焦时才起作用

    我设计了一个可重用的用户控件 它包含 UserControl InputBindings 它非常简单 因为它只包含一个标签和一个按钮 以及新属性等 当我在窗口中使用该控件时 它运行良好 但键绑定仅在聚焦时才起作用 当一个控件绑定到 alt
  • Android 应用程序:获取 Google Drive API 的访问令牌

    我正在编写一个 Android ICS 版本 应用程序 它将数据上传到 Google Drive 该应用程序 使用 oauth2 获取访问令牌 第一步 获取授权令牌 String AUTH TOKEN TYPE oauth2 https w