当前位置: 首页 > 知识库问答 >
问题:

Google Drive API迁移到REST API

唐炳
2023-03-14

由于Google不推荐Android API,我正在尝试迁移到REST API。

我的应用程序使用Google Drive保存用户数据。

用户有两种备份选项(手动和计划)。

用户选择一个帐户并将其存储在应用程序(电子邮件)中。

需要时,该应用程序使用该帐户连接到Google Drive并保存/删除数据。

要选择要使用应用程序的帐户,请使用Account tPicker。

选择帐户后,应用程序将仅使用该帐户连接到Google Drive(请参阅下面的代码)。

我想保留当前的机制(用户选择一个帐户,需要时应用程序使用该帐户连接到Google Drive)。

我查看了示例程序和迁移文档,但没有弄清楚如何执行。

在示例应用程序中,提示输入具有专用活动的帐户,并使用返回的数据登录到Google Drive(而不是我需要的行为)。

我做了一些代码更改,但没有任何效果(我得到错误驱动器连接失败(12500)12500:12500:设置Google帐户时出错)。请参见下面修改的代码。

退出代码

GoogleApiClient.Builder builder = new GoogleApiClient.Builder(context)
                .addApi(Drive.API)
                .setAccountName(accountName)
                .addScope(Drive.SCOPE_FILE)
                .addScope(Drive.SCOPE_APPFOLDER);
client = builder.build();
client.registerConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
            @Override
            public void onConnectionSuspended(int cause) {
            }

            @Override
            public void onConnected(Bundle arg0) {
                latch.countDown();
            }
        });
client.registerConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
            @Override
            public void onConnectionFailed(ConnectionResult result) {
                error = new DriveConnectException();
                if (result.hasResolution()) {
                    if (activity != null) {
                        try {
                            result.startResolutionForResult(activity, requestCode);
                            error = new InResolutionException();
                        } catch (IntentSender.SendIntentException e) {
                        }
                    }
                }
                latch.countDown();
            }
        });
client.connect();
try {
    latch.await();
} catch (Exception ignored) {
}
if (client.isConnected()) {
    // do some work
} else {
    // report error
}

修改后的代码

GoogleSignInOptions signInOptions =
        new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .setAccountName(accountName)
                .requestScopes(new Scope(DriveScopes.DRIVE))
                .build();
client = GoogleSignIn.getClient(context, signInOptions);
Task<GoogleSignInAccount> task = client.silentSignIn();
if (task.isSuccessful()) {
    signInAccount = task.getResult();
} else {
    final CountDownLatch latch = new CountDownLatch(1);
    task.addOnCompleteListener(new OnCompleteListener<GoogleSignInAccount>() {
        @Override
        public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
            try {
                signInAccount = task.getResult(ApiException.class);
            } catch (ApiException e) {
                // I always ends up here.
            }
            latch.countDown();
        }
    });
    try {
        latch.await();
    } catch (Exception ignored) {
    }
}

共有1个答案

龙隐水
2023-03-14

首先,您需要登录用户:

    GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestScopes(new Scope(DriveScopes.DRIVE_FILE))
            .build();
    GoogleSignInClient client = GoogleSignIn.getClient(activity, signInOptions);

    // The result of the sign-in Intent is handled in onActivityResult
    startActivityForResult(client.getSignInIntent(), RC_CODE_SIGN_IN);

在onActivityResult中:

GoogleSignIn.getSignedInAccountFromIntent(result)
                .addOnSuccessListener(new OnSuccessListener<GoogleSignInAccount>() {
                    @Override
                    public void onSuccess(GoogleSignInAccount googleSignInAccount) {
                        HyperLog.i(TAG, "Signed in as " + googleSignInAccount.getEmail());
                        mDriveServiceHelper = getDriveServiceHelper(googleSignInAccount);
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        HyperLog.e(TAG, "Unable to sign in!", e);
                    }
                });

用户已登录的帐户,您可以使用以下帐户检索上一个Google登录帐户:

GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(getActivity());

要获取DriveServiceHelper,您可以使用检索到的帐户:

mDriveServiceHelper = getDriveServiceHelper(account);

“getDriveServiceHelper”方法如下所示:

private DriveServiceHelper getDriveServiceHelper(GoogleSignInAccount googleSignInAccount) {
        // Use the authenticated account ot sign in to the Drive service
        GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(
                activity, Collections.singleton(DriveScopes.DRIVE_FILE));
        credential.setSelectedAccount(googleSignInAccount.getAccount());

        Drive googleDriveService = new Drive.Builder(AndroidHttp.newCompatibleTransport(),
                new GsonFactory(), credential)
                .setApplicationName("COL Reminder")
                .build();
        return new DriveServiceHelper(googleDriveService);
    }
 类似资料:
  • Angular 是使用 TypeScript 构建的,并且支持向 Angular 提供元信息的装饰器。 TypeScript 的装饰器会让语法感觉更加“自然”,尽管有可能使用 Angular 没有的功能。

  • Redux 不是一个单一的框架,而是一系列的约定和一些让他们协同工作的函数。你的 Redux 项目的主体代码甚至不需要使用 Redux 的 API,大部分时间你其实是在编写函数。 这让到 Redux 的双向迁移都非常的容易。 我们可不想把你限制得死死的! 从 Flux 项目迁移 Reducer 抓住了 Flux Store 的本质,因此,将一个 Flux 项目逐步到 Redux 是可行的,无论你使

  • 我正试图迁移到AndroidX,我们在我们的项目中使用这个库。然而,这目前在我们的项目中引起了一个问题: 无法解析对“module @ build type/compile class path”的依赖项:无法使用转换JetifyTransform转换文件“localytics-1.3.0.aar”以匹配属性{artifactType=processed-aar} 删除库会使此问题消失。在这个库被

  • 如果你现在有一个正在使用其他 VCS 的代码库,但是你已经决定开始使用 Git,必须通过某种方式将你的项目迁移至 Git。 这一部分会介绍一些通用系统的导入器,然后演示如何开发你自己定制的导入器。 你将会学习如何从几个大型专业应用的 SCM 系统中导入数据,不仅因为它们是大多数想要转换的用户正在使用的系统,也因为获取针对它们的高质量工具很容易。 Subversion 如果你阅读过前面关于 git

  • 对于 iOS 自动化,Appium 依赖苹果提供的系统框架。对于 iOS 9.2 及更低版本,苹果唯一的自动化技术被称为UIAutomation,它运行在 “Instruments” 中。从 iOS 10 开始,苹果已经完全删除了 UIAutomation 工具,因此 Appium 不可能按照以前的方式进行测试。同时,苹果推出了一款名为 XCUITest 的新型自动化技术,从 iOS 9.3 到

  • 关于此文档 SQLAlchemy 2.0为核心组件和ORM组件中的各种关键SQLAlchemy使用模式带来了重大转变。这个版本的目标是对SQLAlchemy早期以来的一些最基本的假设做一点小小的调整,并提供一个新的简化的使用模型,这个模型希望在核心和ORM组件之间更加简洁和一致,并且更加有能力。Python从python3变成python3以及python3逐渐出现的类型系统是这种转变的最初启示,

  • 我找遍了,但看不出有没有办法。我有两个LXC容器在Ubuntu 14.04主机上运行Ubuntu 14.04。它们对我来说非常重要,所以我希望在主机硬件出现故障时能够轻松地将LXC容器备份/迁移到另一台服务器。 我现在已经用LXD构建了一个新的Ubuntu 15.1服务器,并且已经注销并返回并看到了新的组。为了测试,我用我14.04主机上的开关将我现有的一个LXC容器连接起来: ---然后在新服务

  • 声明 接受LoggerFactory的对org.apache.Log4j.logger.getLogger的调用必须删除org.apache.Log4j.spi.LoggerFactory并使用Log4J2的其他扩展机制之一。 log4j2中有哪些扩展机制,以及如何在log4j2中最好地迁移如下所示的方法