从Android应用访问公共Google云端硬盘文件夹,而不进行身份验证

时间:2017-05-23 19:18:24

标签: android google-drive-api google-api-client google-drive-android-api public-folders

我希望我的应用能够从预定义的共享公共Google云端硬盘文件夹中读取,而无需用户登录或选择Google帐户。

背景/环境

使用我的桌面浏览器,我在Google云端硬盘上创建了一个公共文件夹,该文件夹已设置为公开。任何有链接的人都可以访问(读取)驱动器,因此无需授权:

Desktop screen capture of shared Google Drive folder

在我的Android Studio项目中,我已进入File > Project Structure > Dependencies并添加了com.google.android.gms:play-services-drive:10.2.0

Android Studio image of Google Play Services as a module dependency

我现在可以创建new GoogleApiClient.Builder()

问题

我查看了各种示例,但在大多数情况下,驱动程序是由Android应用程序创建的。这不是我试图管理的情况。

此问题是关于使用"文件夹ID"访问已公开的驱动器。或者您最初共享和公开文件夹时分配的0B6X74x23H....

我已经检查了demo code provided by Google,但据推测,这不适用于公用文件夹,因为它说:

  

...需要注册OAuth 2.0客户端

至少,我可以使用http-client驱动该过程,在没有身份验证的情况下转到共享链接https://drive.google.com/drive/folders/0B6X74x23Hx7DNE13M0ZIbVI....?usp=sharing,而不需要跳过箍。但是,当然使用已定义的API并简单地指定公共共享文件夹以列出内容并且如果需要,从公共文件夹下载文件将更加清晰。

当我尝试这段代码时:

        Scope publicFolder = new Scope(EXISTING_FOLDER_ID);
        mGoogleApiClient = new GoogleApiClient.Builder(mActivity)
                .addApi(Drive.API)
                .addScope(publicFolder)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
        mGoogleApiClient.connect();

此方法触发:

GoogleApiClient.OnConnectionFailedListener.onConnectionFailed()

结果包含statusCode=SIGN_IN_REQUIRED。但当然,对于公开的文件夹,不需要登录。

1 个答案:

答案 0 :(得分:0)

这是 Jsoup 的解决方法

implementation 'org.jsoup:jsoup:1.11.3'

val url = "https://drive.google.com/drive/folders/xxxxxxxxxxxxxxxxxx"   // shared folder link
val doc = Jsoup.connect(url).get()
doc.outputSettings().prettyPrint(false)

val files = doc.select("div.WYuW0e")
for (file in files){
    val fileName = file.text()
    val fileID = file.attr("data-id")

    val downloadLink = "https://drive.google.com/uc?export=download&id=$fileID" 
    //the downloadLink may open a 'Google Drive can't scan this file for viruses' page
    
    // below we check for the new link  
    val doc2 = Jsoup.connect(downloadLink).get()
    doc2.outputSettings().prettyPrint(false)
    val elem = doc2.select("[id='uc-download-link']")
    val newLink = if (elem.size != 0){
        "https://drive.google.com" + elem.first().attr("href")
    } else {
        downloadLink
    }
}