API Google Диска не может перечислить файлы (v3 Java) - PullRequest
0 голосов
/ 07 ноября 2019

Я использую Google API в Java и у меня есть следующие фрагменты кода.

    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.security.GeneralSecurityException;
    import java.util.Collections;
    import java.util.List;
    import java.lang.Object;
    import java.util.ArrayList;

    import com.google.api.client.auth.oauth2.Credential;
    import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
    import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
    import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
    import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
    import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
    import com.google.api.client.http.javanet.NetHttpTransport;
    import com.google.api.client.json.JsonFactory;
    import com.google.api.client.json.jackson2.JacksonFactory;
    import com.google.api.client.util.store.FileDataStoreFactory;
    import com.google.api.services.drive.Drive;
    import com.google.api.services.drive.Drive.Files;
    import com.google.api.services.drive.DriveScopes;
    import com.google.api.services.drive.model.File;
    import com.google.api.services.drive.model.FileList;


    public class DriveQuickstart {

        private static final String APPLICATION_NAME = "DriveQuickstart";
        private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
        private static final String TOKENS_DIRECTORY_PATH = "tokens";

        // * Global instance of the scopes required by this quickstart.
        // * If modifying these scopes, delete your previously saved tokens/ folder.

        private static final List<String> SCOPES = Collections.singletonList(DriveScopes.DRIVE_METADATA_READONLY);
        private static final String CREDENTIALS_FILE_PATH = "C:/Quickstart/src/main/resources/client_secret.json";

// * Creates an authorized Credential object.
// * @param HTTP_TRANSPORT The network HTTP Transport.
// * @return An authorized Credential object.
// * @throws IOException If the client_secret.json file cannot be found.
// */
private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
    // Load client secrets.
    InputStream in = new FileInputStream(CREDENTIALS_FILE_PATH);
    if (in == null) {
        throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
    }
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

    // Build flow and trigger user authorization request.
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
            HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
            .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
            .setAccessType("offline")
            .build();
    LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
    return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");

}

public static void main(String[] args) throws IOException, GeneralSecurityException {
    try
    {
    // Build a new authorized API client service.
    System.out.println("This is a test line");

    //declare final variable NetHttpTransport and GoogleNetHttpTransport from import statements
    final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
    System.out.println("This is the second test line");
    Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
            .setApplicationName(APPLICATION_NAME)
            .build();

    System.out.println("This is the third test line");

    // Print the names and IDs for files.
    FileList result = service.files().list()
            .setPageSize(10)
            .setFields("nextPageToken, files(id, name)")
            .execute();
    List<File> files = result.getFiles();
    if (files == null || files.isEmpty()) {
        System.out.println("No files found.");
    } else {
        System.out.println("Files:");
        for (File file : files) {
            System.out.printf("%s (%s)\n", file.getName(), file.getId());
        }
    }
    Drive.Files var1 = service.files();
    System.out.println("var1 = " + var1.toString());
    Drive.Files.List var2 = var1.list();
    if (var2 == null)
        System.out.println("null");
    else {
        System.out.printf("Var2 size is: %d\n", var2.size() );
    }
    //iterate through map and print results
    }
    catch(Exception  e){
        System.out.println("error");
    }

    System.out.println("This is the fourth test line");

}

    }

    }    

Для более подробной информации. Я использую несколько нетрадиционный метод, чтобы попробовать это. Я использую только командную строку для запуска (без IDE, без Gradle).

Вот ссылка на ss с моим выводом в командной строке. cmd output

Предполагая, что я на самом деле обращаюсь к метаданным в Google Диске, и что Drive.Files вложен в Абстрактную карту (java.util.AbstractMap), я должен иметь возможностьчтобы вернуть размер карты, чтобы получить представление о том, где она ищет, сколько файлов она возвращает.

Я не уверен, что происходит. В первый раз, когда я компилирую и запускаю, в Chrome открывается вкладка, запрашивающая разрешение на доступ к метаданным на диске. Во второй раз выдает сообщение «ПРЕДУПРЕЖДЕНИЕ: невозможно изменить разрешения для всех:». Кроме того, var1 ('set to service.files ()') возвращает com.google.api.services.drive.Drive$Files@458ad742 при использовании toString (). Подкласс service.files (). List (), назначенный для var2, должен возвращать список файлов на моем Google Диске, но, по-видимому, он этого не делает.

Я, возможно, неправильно понимаю много вещей, так чтосо мной. Спасибо за помощь.

В случае, если люди спрашивают, я попробовал учебное пособие здесь https://developers.google.com/drive/api/v3/quickstart/java Он открыл вкладку, чтобы запросить доступ к метаданным для Google Диска на любом аккаунте Google, который я выбрал.

сохраненный идентификатор

Так что, исходя из этого, я (думаю) подключился к Google Drive. Однако код по умолчанию, который должен перечислять имена и идентификаторы 10 файлов, ничего не делает.

Как я запускаю программу: вот пакетный файл, который я использую для компиляции и запуска кода в cmd.

    jar cfe DriveQuickstart.jar Quickstart DriveQuickstart.class
    javac -cp ./* DriveQuickstart.java
    java -cp ./* DriveQuickstart

По какой-то причине я не знаю /поймите, это был единственный способ, который не возвращал бы методы из импортированных файлов JAR, которые не существуют.

1 Ответ

0 голосов
/ 07 ноября 2019

Ознакомьтесь с Java Quickstart , чтобы узнать, как получить результаты вызовов API.

Проблемы

1 - setPermissionsToOwnerOnly

Я не уверен, что происходит. В первый раз, когда я компилирую и запускаю, в Chrome открывается вкладка, запрашивающая разрешение на доступ к метаданным на диске. Во второй раз выдается сообщение «ПРЕДУПРЕЖДЕНИЕ: невозможно изменить разрешения для всех:».

Похоже, это связано с этой проблемой . Это может означать, что папка, из которой вы используете код, имеет права доступа, отличные от ожидаемых.

Это происходит, если вы поместите код на рабочий стол (как пример), а затем запустите его оттуда?

2 - toString()

Кроме того, var1 ('set to service.files ()') возвращает com.google.api.services. drive.Drive$Files@458ad742 при использовании toString (). Подкласс service.files (). List (), назначенный для var2, должен возвращать список файлов на моем Google Диске, но, видимо, он этого не делает.

Эта странная строка показывает, как печатает Javaэкземпляр класса.

com.google.api.services.drive.Drive$Files@458ad742
<NAMESPACE>$<CLASS>@<HASHCODE>

Тот факт, что метод toString выводит это, означает, что этот метод не был перезаписан для этого конкретного класса , поэтому он вызываетобщая Object.toString() метод .

Чтобы распечатать то, что вы хотите увидеть, попробуйте вложенные методы.

...