Доступ к общедоступной папке Google Drive из приложения Android без аутентификации

Мне бы хотелось, чтобы мое приложение могло читать из заранее определенной общедоступной папки Google Drive без необходимости входа или выбора учетной записи Google.

Фон / Окружающая среда

Используя мой настольный браузер, я создал общую папку на своем Google Диске, которая настроена как общедоступная. Любой человек, имеющий ссылку, может получить доступ (прочитать) к диску, поэтому авторизация не требуется:

Снимок экрана рабочего стола общей папки Google Диска

В моем проекте Android Studio я вошел в File > Project Structure > Dependencies и добавил com.google.android.gms:play-services-drive:10.2.0

Образ Android Studio Сервисов Google Play как модуль зависимости

Теперь у меня есть возможность создать new GoogleApiClient.Builder(),

Вопрос

Я посмотрел на различные примеры, но в большинстве случаев диск был создан приложением Android. Это не та ситуация, которой я пытаюсь управлять.

Этот вопрос касается доступа к диску, который был обнародован с использованием "идентификатора папки" или как вы называете 0B6X74x23H.... это было назначено, когда папка была открыта для общего доступа и опубликована.

Я ознакомился с демонстрационным кодом, предоставленным Google, но, по-видимому, он не предназначен для общедоступных папок, поскольку в нем говорится:

... нужно зарегистрировать клиент OAuth 2.0

Как минимум, я мог бы управлять процессом с помощью http-клиента, перейдя по ссылке для обмена 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 ответ

Вот обходной путь с 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
    }
}