【问题标题】:Get folder in Android application, that was not created via this App在 Android 应用程序中获取不是通过此应用程序创建的文件夹
【发布时间】:2014-03-07 06:38:19
【问题描述】:

拥有包含文件夹和文件的 Google 云端硬盘帐户。我想制作 android 应用程序来添加和获取文件。 QUERY 类很有用,但它只能用于应用程序生成数据

Android Drive API 仅适用于 https://www.googleapis.com/auth/drive.file 范围。这意味着只有用户使用您的应用程序打开或创建的文件才能被查询匹配。

请帮助,如何将文件添加到早期通过 web 界面创建的任何文件夹?

【问题讨论】:

    标签: android google-drive-api google-drive-android-api


    【解决方案1】:

    除非您确实需要,否则您希望避免使用完整的驱动器范围。用户更喜欢您的应用程序的范围更窄,因为这样更容易信任您的数据。有几种方法可以完成大多数文件夹用例,同时仍然只需要文件范围:

    使用OpenFileActivity 让用户选择他们希望将文件添加到的文件夹。

    您可以通过将 OpenFileActivityBuilder 配置为仅显示文件夹 mimetypes 来做到这一点。

     IntentSender intent = driveApi.newOpenFileActivityBuilder()
        .setActivityTitle("Pick a destination folder")
        .setMimeType(new String[] { DriveFolder.MIME_TYPE } })
        .build();
     startIntentSenderForResult(intent, REQUEST_CODE, null, 0, 0, 0);
    

    或者,如果您有相应的 Web 应用程序创建了该文件夹,只需对两个应用程序使用相同的开发者控制台条目,您应该已经可以访问该文件夹。

    【讨论】:

    • 嗨 Cheryl,我们的情况完全不同。我们打算为用户提供私有/个人云存储。我们存储的数据由不同的应用程序(桌面应用程序、移动应用程序......)生成。因此,如果我们使用 drive.file,我们的移动应用程序将无法访问桌面应用程序上传的数据。目前,Java Drive SDK(它有驱动范围)很好地为我们服务,但不是谷歌播放服务提供的 API(它只有 drive.file 范围)。我想知道,Google 团队是否打算扩大范围以驱动范围,用于 Google Play 服务?谢谢。
    • 您的移动版和桌面版应用应该共享相同的应用 ID,从而能够共享对彼此创建的文件的访问权限。只需在云控制台中使用一个条目即可。
    【解决方案2】:

    不要使用最新的 google API,它是几周前刚刚发布的。它目前仅适用于 drive.file 范围,尚未实现许多功能(例如设置多个父级),并且根据我的经验,它还包含一些需要修复的错误。

    com.google.android.gms.common.api.GoogleApiClient
    

    改用这个 API:

    com.google.api.services.drive.Drive
    
        try {
    
    
            List<String> scopes = new ArrayList<String>();
            scopes.add("https://www.googleapis.com/auth/drive.appdata");
            scopes.add(DriveScopes.DRIVE);
    
            GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(m_context, scopes);
            credential.setSelectedAccountName(m_account.name);          
    
    
            //Get token cannot be run from the main thread;
            //Trying to get a token right away to see if we are authorized
    
            token = credential.getToken();
    
            if(token == null){
                Log.e(TAG, "token is null");
            }else{
                Log.i(TAG, "GDrive token: " + token);
                g_drive = new Drive.Builder(
                              AndroidHttp.newCompatibleTransport(),
                              new GsonFactory(), credential).build();
    
         } catch ( UserRecoverableAuthException e) {
           ....
         }
    

    【讨论】:

    • 好的,谢谢,那么我在哪里可以获得有关此 API 的教程?我找不到如何使用 GoogleAccountCredential
    • 我搜索了一下,但不幸的是没有看到一个好的指南。 Google 已经将其android guide 移至新的 API;最接近使用“服务”API 的是常规 Java 指南 here。主要区别在于,当您调用 credential.getToken() 并失败时,googlePlayServices 会返回一个异常,其中包含您的应用可以捕获并运行以提示用户授予您权限的意图。
    • 顺便说一句,新的android guide 也有谷歌帐户凭据。它是一个不同的版本,但几乎相同——我注意到的主要区别是它返回一个“UserRecoverableAuthIOException”——注意“IO”;
    猜你喜欢
    • 2016-09-27
    • 2016-12-02
    • 2014-02-06
    • 2017-10-14
    • 1970-01-01
    • 2015-12-28
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多