Integrar com o menu de contexto "Abrir com" da IU do Drive

Quando um usuário seleciona um arquivo e clica em "Abrir com" na interface do Google Drive item de menu, os redirecionamentos do Drive o usuário para o URL aberto desse aplicativo definido em Configurar uma interface do Google Drive de ML.

Se você marcou a opção "Importando" quando você configurou uma interface do Google Drive integrada, o usuário pode selecionar uma combinação de aplicativos específicos arquivos do Google Workspace para abrir. Ao configurar a interface do Drive integração, os arquivos específicos do app são definidos no bloco "Tipos MIME padrão" e "Extensões de arquivo padrão" campos, enquanto o Google Workspace são definidos na pasta "Tipos MIME secundários" e "Extensões de arquivo secundárias" campos.

Para cada arquivo que o usuário quer abrir, o Drive verifica o código MIME de acordo com os tipos MIME padrão e secundários definidos:

  • Para tipos MIME definidos em "Tipos MIME padrão" , o ID do arquivo é passados para seu app. Para mais informações sobre como processar arquivos específicos do app, consulte Processar um URL aberto para documentos específicos de apps.

  • Para tipos MIME definidos em "Tipos MIME secundários", , o campo Interface do Drive mostrando uma caixa de diálogo perguntando ao usuário qual tipo de arquivo converter o arquivo do Google Workspace. Por exemplo, se você selecionar do app Documentos Google na interface do Drive e o arquivo "MIME secundário" tipos" sugere que seu aplicativo suporta texto/simples ou aplicativo/pdf, o A interface do Drive pergunta ao usuário se ele quer converter para texto simples ou PDF.

    Para mais informações sobre como usar o Google Workspace arquivos, consulte Processar um URL aberto para documentos do Google Workspace. Para acessar uma lista de documentos do Google Workspace e formatos de conversão de tipo MIME, consulte Exportar tipos MIME para o Google Workspace documentos.

Processar um URL aberto para documentos específicos do app

Como mencionado em Configurar uma interface do Drive integração, seu app recebe variáveis de modelo com informações para abrir o arquivo. Seu app recebe um conjunto padrão de variáveis de modelo em um parâmetro state. A as informações padrão de state para um URL aberto específico do app são:

{
  "ids": ["ID"],
  "resourceKeys":{"RESOURCE_KEYS":"RESOURCE_KEYS"},
  "action":"open",
  "userId":"USER_ID"
}

Esta saída inclui os seguintes valores:

  • ID: o ID da pasta pai.
  • RESOURCE_KEYS: um dicionário JSON de IDs de arquivo mapeados para as respectivas chaves de recurso.
  • open: a ação que está sendo realizada. O valor é open ao usar um Open URL.
  • USER_ID: o ID do perfil que identifica exclusivamente o usuário.

Para atender a essa solicitação, o app precisa seguir estas etapas:

  1. Verifique se o campo action tem um valor de open e se o campo ids é presente.
  2. Use o valor userId para criar uma nova sessão para o usuário. Para mais informações sobre usuários conectados, consulte Usuários e novos eventos.
  3. Use o método files.get para verificar buscar metadados de arquivos e fazer download do conteúdo deles usando os valores ID.
  4. Se resourceKeys tiver sido definido na solicitação, defina o X-Goog-Drive-Resource-Keys. Para mais informações sobre de recurso, consulte Acessar arquivos compartilhados por link usando chaves.

O parâmetro state é codificado para uso em URL, portanto, seu app precisa processar o escape. e analisar como JSON.

Processar um URL aberto para documentos do Google Workspace

Como mencionado em Configurar uma interface do Drive integrada, seu app recebe um conjunto padrão de variáveis de modelo em um parâmetro state. As informações padrão de state para um URL aberto do Google Workspace é:

{
  "exportIds": ["ID"],
  "resourceKeys":{"RESOURCE_KEYS":"RESOURCE_KEYS"},
  "action":"open",
  "userId":"USER_ID"
}

Esta saída inclui os seguintes valores:

  • EXPORT_ID: uma lista separada por vírgulas de IDs de arquivo que estão sendo exportado (usado apenas ao abrir documentos integrados do Google).
  • RESOURCE_KEYS: um dicionário JSON de IDs de arquivo mapeados para as respectivas chaves de recurso.
  • open: a ação que está sendo realizada. O valor é open ao usar um Open URL.
  • USER_ID: o ID do perfil que identifica o usuário.

Para atender a essa solicitação, o app precisa seguir estas etapas:

  1. Verifique se esta é uma solicitação para abrir um arquivo detectando o open no campo state e a presença do campo exportIds.

  2. Use o método files.get para verificar de arquivos, buscar metadados de arquivos e determinar o tipo MIME usando a EXPORT_ID.

  3. Converta o conteúdo do arquivo usando a função método files.export. O seguinte exemplo de código mostra como exportar um documento do Google Workspace para o o tipo MIME solicitado.

  4. Se resourceKey tiver sido definido na solicitação, defina o X-Goog-Drive-Resource-Keys. Para mais informações sobre de recurso, consulte Acessar arquivos compartilhados por link usando chaves.

    Java

    drive/snippets/drive_v3/src/main/java/ExportPdf.java
    import com.google.api.client.googleapis.json.GoogleJsonResponseException;
    import com.google.api.client.http.HttpRequestInitializer;
    import com.google.api.client.http.javanet.NetHttpTransport;
    import com.google.api.client.json.gson.GsonFactory;
    import com.google.api.services.drive.Drive;
    import com.google.api.services.drive.DriveScopes;
    import com.google.auth.http.HttpCredentialsAdapter;
    import com.google.auth.oauth2.GoogleCredentials;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Arrays;
    
    /* Class to demonstrate use-case of drive's export pdf. */
    public class ExportPdf {
    
      /**
       * Download a Document file in PDF format.
       *
       * @param realFileId file ID of any workspace document format file.
       * @return byte array stream if successful, {@code null} otherwise.
       * @throws IOException if service account credentials file not found.
       */
      public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException {
        // Load pre-authorized user credentials from the environment.
        // TODO(developer) - See https://developers.google.com/identity for
        // guides on implementing OAuth2 for your application.
        GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
            .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE));
        HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
            credentials);
    
        // Build a new authorized API client service.
        Drive service = new Drive.Builder(new NetHttpTransport(),
            GsonFactory.getDefaultInstance(),
            requestInitializer)
            .setApplicationName("Drive samples")
            .build();
    
        OutputStream outputStream = new ByteArrayOutputStream();
        try {
          service.files().export(realFileId, "application/pdf")
              .executeMediaAndDownloadTo(outputStream);
    
          return (ByteArrayOutputStream) outputStream;
        } catch (GoogleJsonResponseException e) {
          // TODO(developer) - handle error appropriately
          System.err.println("Unable to export file: " + e.getDetails());
          throw e;
        }
      }
    }

    Python

    drive/snippets/drive-v3/file_snippet/export_pdf.py
    import io
    
    import google.auth
    from googleapiclient.discovery import build
    from googleapiclient.errors import HttpError
    from googleapiclient.http import MediaIoBaseDownload
    
    
    def export_pdf(real_file_id):
      """Download a Document file in PDF format.
      Args:
          real_file_id : file ID of any workspace document format file
      Returns : IO object with location
    
      Load pre-authorized user credentials from the environment.
      TODO(developer) - See https://developers.google.com/identity
      for guides on implementing OAuth2 for the application.
      """
      creds, _ = google.auth.default()
    
      try:
        # create drive api client
        service = build("drive", "v3", credentials=creds)
    
        file_id = real_file_id
    
        # pylint: disable=maybe-no-member
        request = service.files().export_media(
            fileId=file_id, mimeType="application/pdf"
        )
        file = io.BytesIO()
        downloader = MediaIoBaseDownload(file, request)
        done = False
        while done is False:
          status, done = downloader.next_chunk()
          print(f"Download {int(status.progress() * 100)}.")
    
      except HttpError as error:
        print(f"An error occurred: {error}")
        file = None
    
      return file.getvalue()
    
    
    if __name__ == "__main__":
      export_pdf(real_file_id="1zbp8wAyuImX91Jt9mI-CAX_1TqkBLDEDcr2WeXBbKUY")

    Node.js

    drive/snippets/drive_v3/file_snippets/export_pdf.js
    /**
     * Download a Document file in PDF format
     * @param{string} fileId file ID
     * @return{obj} file status
     * */
    async function exportPdf(fileId) {
      const {GoogleAuth} = require('google-auth-library');
      const {google} = require('googleapis');
    
      // Get credentials and build service
      // TODO (developer) - Use appropriate auth mechanism for your app
      const auth = new GoogleAuth({
        scopes: 'https://www.googleapis.com/auth/drive',
      });
      const service = google.drive({version: 'v3', auth});
    
      try {
        const result = await service.files.export({
          fileId: fileId,
          mimeType: 'application/pdf',
        });
        console.log(result.status);
        return result;
      } catch (err) {
        // TODO(developer) - Handle error
        throw err;
      }
    }

    PHP

    drive/snippets/drive_v3/src/DriveExportPdf.php
    use Google\Client;
    use Google\Service\Drive;
    function exportPdf()
    {
        try {
            $client = new Client();
            $client->useApplicationDefaultCredentials();
            $client->addScope(Drive::DRIVE);
            $driveService = new Drive($client);
            $realFileId = readline("Enter File Id: ");
            $fileId = '1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo';
            $fileId = $realFileId;
            $response = $driveService->files->export($fileId, 'application/pdf', array(
                'alt' => 'media'));
            $content = $response->getBody()->getContents();
            return $content;
    
        }  catch(Exception $e) {
             echo "Error Message: ".$e;
        }
    
    }

Exibe arquivos convertidos como somente leitura ou apresenta uma caixa de diálogo que permite ao usuário salve o arquivo como o novo tipo de arquivo.

O parâmetro state é codificado para uso em URL, portanto, seu app precisa processar o escape. e analisar como JSON.

Usuários e novos eventos

Os aplicativos do Google Drive devem tratar todas as mensagens "abrir com" eventos como potencial logins. Alguns usuários podem ter várias contas. Por isso, o ID do usuário na state pode não corresponder à sessão atual. Se o ID do usuário na state não corresponder à sessão atual, encerre-a para sua e faça login como o usuário solicitado.

Além de abrir um aplicativo a partir da interface de usuário do Google Drive, os aplicativos podem mostrar um seletor de arquivos para selecionar conteúdo de um app. Para mais mais informações, consulte o Seletor do Google.