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

Quando um usuário seleciona um arquivo e clica no item de menu "Abrir com" da IU do Drive, o Drive redireciona o usuário para o URL de abertura do app definido em Configurar uma integração da IU do Drive.

Se você marcou a caixa "Importação" ao configurar uma integração da IU do Drive, o usuário vai poder selecionar uma combinação de arquivos específicos do app e do Google Workspace para abrir. Quando você configura uma integração com a IU do Drive, os arquivos específicos do app são definidos nos campos "Tipos MIME padrão" e "Extensões de arquivo padrão", enquanto os arquivos do Google Workspace são definidos nos campos "Tipos MIME secundários" e "Extensões de arquivo secundárias".

Para cada arquivo que o usuário quer abrir, o Drive verifica os tipos MIME em relação aos tipos MIME padrão e secundários definidos:

  • Para tipos MIME definidos no campo "Tipos MIME padrão", o ID do arquivo é transmitido para o app. Para informações sobre como processar arquivos específicos do app, consulte Processar um URL aberto para documentos específicos do app.

  • Para os tipos MIME definidos no campo "Tipos MIME secundários", a IU do Drive exibe uma caixa de diálogo perguntando ao usuário em qual tipo de arquivo o Google Workspace será convertido. Por exemplo, se você selecionar um arquivo do Documentos Google na IU do Drive e o campo "Tipos MIME secundários" sugerir que o app oferece suporte a texto/simples ou aplicativo/pdf, a IU do Drive perguntará ao usuário se ele quer converter em texto simples ou PDF.

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

Processar um URL de abertura para documentos específicos do app

Conforme mencionado em Configurar uma integração da IU do Drive, 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. As informações padrão de state para um URL de abertura 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 mãe.
  • RESOURCE_KEYS: um dicionário JSON de IDs de arquivos mapeados para as respectivas chaves de recurso.
  • open: a ação que está sendo realizada. O valor é open ao usar um URL aberto.
  • USER_ID: o ID do perfil que identifica o usuário de forma exclusiva.

Seu app precisa agir de acordo com essa solicitação, seguindo estas etapas:

  1. Verifique se o campo action tem um valor de open e se o campo ids está 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 permissões, buscar metadados de arquivos e fazer o download do conteúdo do arquivo usando os valores ID.
  4. Se resourceKeys tiver sido definido na solicitação, defina o cabeçalho da solicitação X-Goog-Drive-Resource-Keys. Para mais informações sobre chaves de recurso, consulte Acessar arquivos compartilhados por link usando chaves de recurso.

O parâmetro state é codificado para URL. Portanto, seu app precisa processar os caracteres de escape e analisá-los como JSON.

Processar um URL de abertura para documentos do Google Workspace

Conforme mencionado em Configurar uma integração da IU do Drive, 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 de abertura do Google Workspace são:

{
  "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 dos IDs dos arquivos que estão sendo exportados (usada apenas ao abrir documentos integrados do Google).
  • RESOURCE_KEYS: um dicionário JSON de IDs de arquivos mapeados para as respectivas chaves de recurso.
  • open: a ação que está sendo realizada. O valor é open ao usar um URL aberto.
  • USER_ID: o ID do perfil que identifica o usuário.

Seu app precisa agir de acordo com essa solicitação, seguindo estas etapas:

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

  2. Use o método files.get para verificar permissões, buscar metadados de arquivos e determinar o tipo MIME usando os valores EXPORT_ID.

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

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

    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
    from __future__ import print_function
    
    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;
        }
    
    }

Mostre os arquivos convertidos como somente leitura ou apresente uma caixa de diálogo que permite ao usuário salvar o arquivo como o novo tipo.

O parâmetro state é codificado para URL. Portanto, seu app precisa processar os caracteres de escape e analisá-los como JSON.

Usuários e novos eventos

Os apps do Drive precisam tratar todos os eventos "abertos com" como possíveis logins. Alguns usuários podem ter várias contas. Portanto, o ID do usuário no parâmetro state pode não corresponder à sessão atual. Se o ID do usuário no parâmetro state não corresponder à sessão atual, encerre a sessão atual do app e faça login como o usuário solicitado.

Além de abrir um aplicativo na IU do Google Drive, os aplicativos podem exibir um seletor de arquivos para selecionar conteúdo dentro de um app. Para mais informações, consulte o Google Picker.