Android Google Drive Rest API:跳过同意屏幕(硬编码帐户)

Android Google Drive Rest API: skip consent screen (hardcoded account)

我正在尝试使用 Google Drive 来同步一些媒体文件 (video/images) 并在我的 android 应用程序中显示它们。

我已经设法使它一切正常但是根据文档(或者至少从第一次阅读来看)看起来必须总是是一个同意屏幕,用户在选择他的 google 帐户后同意该应用从他的驱动器获取数据。

关键是我想 'hardcode' 一个以编程方式同意的帐户,因为我们的应用程序总是从同一帐户获取媒体。

这可能吗??

PD:不建议任何其他存储服务,Drive 是客户的要求。

为避免用户同意,您可以使用 Service Account

在 link 中声明,Google API 预测 API 和 Google 云存储可以代表您无需访问用户信息的应用程序。在这些情况下,您的应用程序需要向 API 证明自己的身份,但 不需要用户同意 。同样,在企业场景中,您的应用程序可以请求对某些资源的委托访问。

对于这些类型的服务器到服务器交互,您需要一个 service account,这是一个属于您的应用程序而不是单个最终用户的帐户。您的应用程序代表服务帐户调用 Google APIs,并且 不需要用户同意。 (在非服务帐户场景中,您的应用程序代表最终用户调用 Google APIs,有时需要用户同意。)

您还可以查看此相关的 SO 问题以获取更多信息。

  • How to use Google Drive SDK in Android project with hardcoded credentials

  • Why does Google OAuth2 re-ask user for permission when i send them to auth url again

最后我设法让它完全正常工作:

  1. 从您的 google 开发者控制台创建一个 服务帐户凭据
  2. 以 json 格式下载您的凭证。
  3. 将文件复制到assets/res/raw.
  4. 将您的 json 重命名为没有奇怪字符的名称(例如:driveserviceprivatekey.json)。
  5. 列表项

        InputStream privateJsonStream = dashboardActivity.getResources().openRawResource(R.raw.driveserviceprivatekey);
        GoogleCredential serviceCredential = GoogleCredential.fromStream(privateJsonStream).createScoped(Arrays.asList(SCOPES));
    
  6. 现在您可以按如下方式使用您的驱动服务:

                HttpTransport transport = AndroidHttp.newCompatibleTransport();
                JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
                this.mService = new com.google.api.services.drive.Drive.Builder(
            transport, jsonFactory, null)
            .setHttpRequestInitializer(credential)
            .build();